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: 28.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 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 28.7.1 [cmath.syn] as indicated:

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