Skip to content

The _d() function seems to cause an infinite loop for large numbers. #711

Description

@dannylong-math

See a minimal working example here.

If I attempt a comparison such as

double a = 1.e19;
expect(a  == _d(1.e19));

then the resulting program hangs. Using 1.e18 instead is no problem. I did not check values in between.

This is compiled with GCC 13.3.0 installed on Ubuntu 24.04.4 LTS via apt.

Compiling with -D CMAKE_BUILD_TYPE=Debug and -D CMAKE_BUILD_TYPE=Release both trigger the bug.

I realize it's a bit strange to perform an equality comparison of two floating points that are fairly large. I encountered this when writing a parser for an input file format used in chemistry communities. The file format is a bit complex and includes physical quantities that can be very large (>1.e20), so it is worth it to check that I read the files correctly. In this case, the read number should be unspoiled by floating point arithmetic errors and so (conceptually) a direct equality check is the appropriate thing to do.

My workaround is to check relative error:

double a = 1.e19;
expect(std::abs(a - 1.e19) / 1.e19 <= _d(1.e-9));

This is acceptable for my use case, but thought I would share the bug.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions