This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++20 status.

3051. Floating point classifications were inadvertently changed in P0175

Section: 29.7.1 [cmath.syn] Status: C++20 Submitter: Thomas Köppe Opened: 2018-01-23 Last modified: 2021-02-25

Priority: 0

View other active issues in [cmath.syn].

View all other issues in [cmath.syn].

View all issues with C++20 status.

Discussion:

The paper P0175 was meant to be a purely editorial change to spell out the synopses of the "C library" headers. However it contained the following inadvertent normative change: The floating point classification functions isinf, isfinite, signbit, etc. (but not fpclassify) used to be specified to return "bool" in C++14. In C, those are macros, but in C++ they have always been functions. During the preparation of P0175, I recreated the function signatures copying the return type "int" from C, but failed to notice that we had already specified those functions differently, so the return type was changed to "int".

To restore the intended specification, we should change the return types of all the is... and signbit classification functions back to bool. Alternatively, we could decide that the return type should actually be int, but that would be a larger discussion.

Proposed resolution for restoring the original wording: Replace return type "int" with return type "bool" and for all the classification/comparison functions after "// classification/comparison functions" in [cmath.syn] except the fpclassify functions.

Related previous issue was LWG 1327(i) and the corresponding NB comment US-136 resolution.

[ 2018-01-29 Moved to Tentatively Ready after 8 positive votes on c++std-lib. ]

[2018-3-17 Adopted in Jacksonville]

Proposed resolution:

This wording is relative to N4713.

  1. Modify 29.7.1 [cmath.syn] as indicated:

    […]
    namespace std {
      […]
      // 29.7.5 [c.math.fpclass], classification / comparison functions
      int fpclassify(float x);
      int fpclassify(double x);
      int fpclassify(long double x);
      int isfinite(float x);
      int isfinite(double x);
      int isfinite(long double x);
      int isinf(float x);
      int isinf(double x);
      int isinf(long double x);
      int isnan(float x);
      int isnan(double x);
      int isnan(long double x);
      int isnormal(float x);
      int isnormal(double x);
      int isnormal(long double x);
      int signbit(float x);
      int signbit(double x);
      int signbit(long double x);
      int isgreater(float x, float y);
      int isgreater(double x, double y);
      int isgreater(long double x, long double y);
      int isgreaterequal(float x, float y);
      int isgreaterequal(double x, double y);
      int isgreaterequal(long double x, long double y);
      int isless(float x, float y);
      int isless(double x, double y);
      int isless(long double x, long double y);
      int islessequal(float x, float y);
      int islessequal(double x, double y);
      int islessequal(long double x, long double y);
      int islessgreater(float x, float y);
      int islessgreater(double x, double y);
      int islessgreater(long double x, long double y);
      int isunordered(float x, float y);
      int isunordered(double x, double y);
      int isunordered(long double x, long double y);
      […]
    }