How to test if float is NaN?

Lionello Lunesu lio at lunesu.remove.com
Fri May 19 05:48:22 PDT 2006


xs0 wrote:
> I think this should work as well:
> 
> if (num == num) {
>     // not NaN
> } else {
>     // NaN
> }

Indeed! This works just fine in VC on x86, but fails miserably on x64...

In a release build the VC8 x64 compiler optimized that "if" to "if(1)" :D

Here's the assembly from a debug build:

inline bool _is_nan( double d ) { return !(d==d); }
0000000000404000  movsd       mmword ptr [rsp+8],xmm0
0000000000404006  push        rdi
0000000000404007  sub         rsp,10h
000000000040400B  mov         rdi,rsp
000000000040400E  mov         rcx,4
0000000000404018  mov         eax,0CCCCCCCCh
000000000040401D  rep stos    dword ptr [rdi]
000000000040401F  movsd       xmm0,mmword ptr [d]
0000000000404025  ucomisd     xmm0,mmword ptr [d]
000000000040402B  je          citkTypes::_is_nan+36h (404036h)
000000000040402D  mov         dword ptr [rsp],1
0000000000404034  jmp         citkTypes::_is_nan+3Dh (40403Dh)
0000000000404036  mov         dword ptr [rsp],0
000000000040403D  mov         al,byte ptr [rsp]
0000000000404040  add         rsp,10h
0000000000404044  pop         rdi
0000000000404045  ret

According to
http://www.ews.uiuc.edu/~cjiang/reference/vc314.htm
they should not have been checking for ZF,PF,CF==1,0,0, but the code 
only checks ZF?

Since by definition a NaN is not equal to anything, including itself, I 
suppose it's a compiler bug?

L.



More information about the Digitalmars-d-learn mailing list