Document: WG14 N1391
Submitter: Fred Tydeman (USA)
Submission Date: 2009-06-29
Subject: Floating-point to int/_Bool
conversions
Unlike sections 6.3.1.3, 6.3.1.4, 6.5.16.1, and G.4.2, which make an explicit exception for _Bool type, F.4 makes no mention of _Bool. I believe that that is an oversite.
In crafting words to correct this, I constructed the following tables show what should happen for various cases:
_Bool b = FP value;
Result b FP value FP exception flags 0 +/- 0.0 none 1 +/- finite none 1 +/- INF none 1 NaN noneint i = FP value;
Result i FP value FP exception flags 0 +/- 0.0 none FP +/- int none trunc(FP) +/- non-int inexact (unspecified) unspecified +/- large invalid unspecified +/- INF invalid unspecified NaN invalid
However, the words in C99 do not reflect that. So, I am proposing changes in the wording to match what should happen.
Proposed changes to C1x
First part of change.
In 6.3.1.2 Boolean type, add a footnote, to end up with
When any scalar value is converted to _Bool, the result is 0 if the value compares equal to 0; otherwise, the result is 1 (footnote).
(footnote) NaNs do not compare equal to 0, so they convert to 1.
Second part of change.
In F.4 Floating to integer conversion, change paragraph 1 from
If the floating value is infinite or NaN or if the integral part of the floating value exceeds the range of the integer type, then the "invalid" floating-point exception is raised and the resulting value is unspecified. Whether conversion of non-integer floating values whose integral part is within the range of the integer type raises the "inexact" floating-point exception is unspecified.319)
to
First, if the integer type is _Bool, then 6.3.1.2 applies for the value and no floating-point exception is raised (even for NaN);
Otherwise, if the floating value is infinite or NaN or if the integral part of the floating value exceeds the range of the integer type, then the "invalid" floating-point exception is raised and the resulting value is unspecified;
Otherwise, the resulting value is determined by 6.3.1.4. Conversion of integral floating values raise no floating-point exceptions. Whether conversion of non-integer floating values raises the "inexact" floating-point exception is unspecified.319)