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
".
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.
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); boolintisfinite(float x); boolintisfinite(double x); boolintisfinite(long double x); boolintisinf(float x); boolintisinf(double x); boolintisinf(long double x); boolintisnan(float x); boolintisnan(double x); boolintisnan(long double x); boolintisnormal(float x); boolintisnormal(double x); boolintisnormal(long double x); boolintsignbit(float x); boolintsignbit(double x); boolintsignbit(long double x); boolintisgreater(float x, float y); boolintisgreater(double x, double y); boolintisgreater(long double x, long double y); boolintisgreaterequal(float x, float y); boolintisgreaterequal(double x, double y); boolintisgreaterequal(long double x, long double y); boolintisless(float x, float y); boolintisless(double x, double y); boolintisless(long double x, long double y); boolintislessequal(float x, float y); boolintislessequal(double x, double y); boolintislessequal(long double x, long double y); boolintislessgreater(float x, float y); boolintislessgreater(double x, double y); boolintislessgreater(long double x, long double y); boolintisunordered(float x, float y); boolintisunordered(double x, double y); boolintisunordered(long double x, long double y); […] }