When to use C float comparison functions?

前端 未结 2 1889
轻奢々
轻奢々 2020-12-13 17:58

In the latest C++ standard, I noticed the following macros :

bool isgreater(float x, float y);
bool isgreaterequal(float x, float y);
bool isless(float x, fl         


        
相关标签:
2条回答
  • 2020-12-13 18:42

    isgreater et al. were incorporated into C++11 from C99. They are defined to not raise the invalid floating-point exception when x and/or y are signalling NaN values.

    The rationale given is:

    This macro is a quiet (non-floating-point exception raising) version of a relational operator. It facilitates writing efficient code that accounts for NaNs without suffering the invalid floating-point exception.

    The numeric value of the macro on NaN is the same as always; NaN values compare false to all other values including NaN values under all relational operators and the new macros.

    0 讨论(0)
  • 2020-12-13 18:49

    Unlike the relational operators, these macros do really only return a boolean value and do never raise any floating point exception.

    In short: You only have to deal with true/false and nothing else.


    references:

    The Open Group descriptions (not the C or C++ standard, but highly relevant in the Unix/Linux world and almost always similar to the standards):

    • http://pubs.opengroup.org/onlinepubs/009695399/functions/islessgreater.html
    • http://pubs.opengroup.org/onlinepubs/009695399/functions/isgreater.html
    • http://pubs.opengroup.org/onlinepubs/009695399/functions/isgreaterequal.html
    • http://pubs.opengroup.org/onlinepubs/009695399/functions/isless.html
    • http://pubs.opengroup.org/onlinepubs/009695399/functions/islessequal.html
    • http://pubs.opengroup.org/onlinepubs/009695399/functions/islessgreater.html
    • http://pubs.opengroup.org/onlinepubs/009695399/functions/isunordered.html

    C++ standard:

    C Library [c.math]:

    The classification/comparison functions behave the same as the C macros with the corresponding names defined in 7.12.3, Classification macros, and 7.12.14, Comparison macros in the C Standard. Each function is overloaded for the three floating-point types, as follows [...]

    C standard:

    7.12.14 Comparison macros

    [...] For any ordered pair of numeric values exactly one of the relationships — less, greater, and equal — is true. Relational operators may raise the ‘‘invalid’’ floating-point exception when argument values are NaNs. For a NaN and a numeric value, or for two NaNs, just the unordered relationship is true. The following subclauses provide macros that are quiet (non floating-point exception raising) versions of the relational operators, and other comparison macros that facilitate writing efficient code that accounts for NaNs without suffering the ‘‘invalid’’ floating-point exception. In the synopses in this subclause, real-floating indicates that the argument shall be an expression of real floating type.

    0 讨论(0)
提交回复
热议问题