Does posix say anything about the sign in NaNs ?

Bruce Evans brde at optusnet.com.au
Sun Dec 28 11:04:57 UTC 2014


On Thu, 25 Dec 2014, Pedro Giffuni wrote:

> On 12/25/14 14:35, Warner Losh wrote:
>>> On Dec 25, 2014, at 7:53 AM, Pedro Giffuni <pfg at freebsd.org> wrote:
>>>> Il giorno 25/dic/2014, alle ore 09:00, Bruce Evans <brde at optusnet.com.au> 
>>>> ha scritto:
>>>> ...
>>>> The library intentionally suppresses the sign for NaNs on output.
>>>> This is consistent with it ignororing the sign for NaNs on input.
>>> 
>>> Interesting and pretty much the reason why I wanted to discuss the change.
>>> 
>>> I can see the sign information is important for infinity but indeed it 
>>> makes
>>> very little sense (if any) for NaN. OTOH, we are doing an extra assignment
>>> to hide something the standard permits. If we are ignoring the sign of 
>>> NaNs
>>> on input there should be no such sign information in the first place and
>>> ignoring the value is unnecessary.

The sign is for debugging, but not very useful without all the NaN bits.

>>> While I am tempted to follow the change, I think it is pretty much 
>>> innocuous
>>> as no reasonably correct program should depend on the sign of NaN.

>> My only concern with this change is that numeric programs might actually 
>> break because they know this implementation detail. Its here some way to 
>> discover if things my pysci or R have any change in behavior here? In 
>> addition to the standard, numerical methods have much apocrypha associated 
>> with them.

> Well, you should only get a NaN when you did something wrong in your 
> calculation
> and that's pretty much the end of it.

No, it is valid to generate NaNs intentionally (in C99 with Annex F).  Then
yo need to debug them.

> Googling around, it appears glibc did a 
> similar
> change, and it did cause issues to someone:
>
> http://stackoverflow.com/questions/3772835/getting-a-negative-nan-on-g-4-4-3-is-this-standard

Interesting.  The application parsed "nan", but couldn't handle "-nan".

This is an application bug.  Any valid inport should be accepted, and
that includes "-nan" and also "NAN" and other variations ending in
"-nan(n-char-sequence)" if you are producing the output using C.
But it is not very useful to generate

I think the application used a simple text parser.  awk(1) accepts
"nan(any)" + 0, as a NaN, but it has a buggy parser since it also
accepts "nanany(any)" + 0 as a NaN.  Parsing C output using C input
routines hopefully works more correctly.

> Given it's implementation dependent I now think it is better to keep the 
> historical
> behavior consistent so I won't be committing the change.

Good.

Bruce


More information about the freebsd-standards mailing list