[cfp-interest 3885] Re: convertFrom and signaling NaNs
Joshua Cranmer
joshua.cranmer at intel.com
Thu Apr 16 16:33:49 PDT 2026
(One side note: I'm not seeing Jan's messages to the list, only Rajan's
replies, and the cfp-interest numbering marks Rajan's messages as
consecutive. Are non-members' messages sent to some moderation queue?)
So my take here is that everything is actually pretty clear if you
understand how everything is supposed to fit together. But to figure
that out, you have to very carefully read 2 different specifications (3,
if you're looking at C++), and proceed to look in all of the wrong
places of those specifications to figure out what anything even means.
If we start in IEEE 754, Table 3.1 lays out 4 different levels of
understanding floating-point arithmetic. Level 1 is extended real
numbers, the mathematical system being approximated. Level 2 refers to
floating-point data, where 0 is broken into -0 and +0, and a single NaN
datum is added. Level 3 are floating-point representations, where finite
numbers are broken into (sign, exponent, significand) and NaN is broken
into a qNaN and sNaN. Level 4 is the final bit string layer (encodings).
And then it gets confusing because, having introduced these layers, the
standard then stops referring to them again, and you have to very
carefully parse the wording to work out what level it's trying to apply
semantics to. (In general, IEEE 754 is largely implicitly describing
semantics in terms of floating-point representations [level 3], although
there are some operations where the standard intends to precisely
describe the encoding [level 4].)
As for C, where we need to start is in fact section 5.3.5.3.3
(Characteristics of floating-point types). Here we find the definition
of floating-point numbers and some discussion on values. p10 starts by
saying "A NaN is a value signifying Not-A-Number. A quiet NaN
propagates..." (note that it says "a quiet NaN" and not "a quiet NaN
value"). Again, here we start having to do some inference to figure out
the intent. A careful reading of this section indicates that perhaps the
best way to understand it is to map things to IEEE 754's definitions,
mapping non-IEEE 754 types to equivalent IEEE 754 concepts as
appropriate (e.g., NOTE 2).
So how do we do the mapping? Again, careful reading illustrates that
there is a difference between "value" and "representation." The C
"representation" corresponds to level 4 in IEEE 754. The C "value" term
is trickier to pin down, but from 5.3.5.3.4 (Characteristics of decimal
floating-point type) and the discussion of quantum exponents
(particularly p9) lets you infer that "value" corresponds to IEEE 754
level 2: a value is a floating-point datum.
It is arguable that you could map "value" to IEEE 754's level 3 (which
distinguishes a qNaN from a sNaN "floating-point representation",
annoyingly the same word that C uses for something different). But
arguing that NaNs having different payloads are distinct values is
pretty clearly wrong. See e.g., EXAMPLE 5 in 6.7.2, where the code has a
comment explicitly saying "quiet NaNs in real floating types are
considered the same value, regardless of payloads," or footnote 453 in
F.10.14.
On 4/16/2026 17:33, RAJAN BHAKTA wrote:
> Hi Jan,
>
> I was giving a specific case of value, but the general case I believe
> holds: The value of a NaN (signaling or otherwise) is a NaN (not a
> number). The signaling or quiet aspects are not a part of the value.
> i.e. Section 6.3.2.5 “Real Floating Types" is concerned with value
> preservation (e.g., 3.14 remains 3.14, infinity remains infinity, NaN
> remains NaN), not with preserving the signaling/quiet distinction. So
> the “precise meaning of an object” is that it’s a NaN. Essentially
> this is similar to how various non-canonical representations can all
> represent the same value, including ones that provide additional
> information outside of the value.
>
> I can see we disagree on this part, and hence it may make sense to
> make a change to the standard to make it clear/explicit.
>
> Regards,
>
> *Rajan Bhakta*
> CFP
>
> *From: *Jan Schultke <janschultke at googlemail.com>
> *Date: *Thursday, April 16, 2026 at 2:36 PM
> *To: *RAJAN BHAKTA <rbhakta at us.ibm.com>
> *Cc: *cfp-interest at oakapple.net <cfp-interest at oakapple.net>
> *Subject: *[EXTERNAL] Re: convertFrom and signaling NaNs
>
> This Message Is From an Untrusted Sender
> You have not previously corresponded with this sender.
> Report Suspicious
> <https://us-phishalarm-ewt.proofpoint.com/EWT/v1/AdhS1Rd-!-XFVHHo80mE1PTx5QApOe0MNwyUrt8VlzhzyXnGn4Y8_94nA7bR9HcQ1oehNyiAE3Gw7otUUz_hDMhyC04yy7R0Sd-8A4pRdkMHubMqr580uF4xrI1ioZLjfiA$>
>
> Hi,
>
> How to handle issues for C (WG14) are given at
> https://www.open-std.org/jtc1/sc22/wg14/issues/
> <https://urldefense.proofpoint.com/v2/url?u=https-3A__www.open-2Dstd.org_jtc1_sc22_wg14_issues_&d=DwMFaQ&c=BSDicqBQBDjDI9RkVyTcHQ&r=XTIN0AwPKAf2bIKNxlzdeqggAytE5h-JEusWpx9MXwc&m=Q07maytVJxXWrqyVGB6sEg51yjqEWSF2wU7ccFJXUClAAvfsz6thR6JHnA7eKU3N&s=tNvLT0zA5tU8F2RRX6RwWm3s91cp_o_OPU-YGZEcT84&e=>.
> Essentially you need to email the issue to c-issues at open-std.org.
>
>
> Thanks, I can do that, but first let's make sure we're on the same page.
>
> For this particular issue, I believe the value for the SNaN is the
> payload and that is unchanged. The operation still raises
> “invalid” as expected from any operation (including conversion)
> other than the very small set that explicitly do not do so (ex.
> The issignaling macro).
>
>
> Firstly, ISO/IEC 60559 merely recommends that NaN payloads are
> propagated. §6.2.3 is full of "should". It would be extremely
> surprising if the C requirement EVEN for implementations that don't
> conform to Annex F was stricter than ISO/IEC 60559. That can't be
> right, but the wording says the value is unchanged, and you're reading
> "value" as synonymous with NaN payload.
>
> Secondly, I don't know why you would read that as being synonymous
> here. "value" as defined in §3.24 is the "precise meaning of the
> contents of an object when interpreted as having a specific type".
> It's a C construct derived from contents of an object, so when the C
> wording requires that a "value" is unchanged, I'm reading that as an
> sNaN not turning into a qNaN since those are two different values.
> However, the underlying hardware operation does turn sNaNs into qNaNs,
> and so does the convertFormat operation in ISO/IEC 60559, so I'm not
> finding any way to read the C wording as non-defective.
>
> Anyway, I'm not really an expert, so I'd be happy if you could
> elaborate on this before I go and report to someone else :)
>
>
> Yours
> Jan
>
> _______________________________________________
> cfp-interest mailing list
> cfp-interest at oakapple.net
> http://mailman.oakapple.net/mailman/listinfo/cfp-interest
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.oakapple.net/pipermail/cfp-interest/attachments/20260416/a5e538da/attachment-0001.htm>
More information about the cfp-interest
mailing list