This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Q: (d = NAN) != NAN?
- From: "Ulrich Windl" <Ulrich dot Windl at rz dot uni-regensburg dot de>
- To: <gcc at gcc dot gnu dot org>
- Date: Fri, 08 Apr 2016 12:09:34 +0200
- Subject: Q: (d = NAN) != NAN?
- Authentication-results: sourceware.org; auth=none
Hello!
Probably I'm doing something wrong, but I have some problems comparing a double with NAN: The value is NAN, but the test fails. Probably I should use isnana().
Here's my test case:
---
#include <math.h>
#include <assert.h>
int main()
{
double d = NAN;
assert(d == NAN);
return 0;
}
---
The output is:
---
> ./foo
foo: foo.c:8: main: Assertion `d == (__builtin_nanf (""))' failed.
Aborted
---
Code is:
---
Dump of assembler code for function main:
0x000000000040059a <+0>: push %rbp
0x000000000040059b <+1>: mov %rsp,%rbp
0x000000000040059e <+4>: sub $0x10,%rsp
0x00000000004005a2 <+8>: mov %fs:0x28,%rax
0x00000000004005ab <+17>: mov %rax,-0x8(%rbp)
0x00000000004005af <+21>: xor %eax,%eax
0x00000000004005b1 <+23>: movabs $0x7ff8000000000000,%rax
0x00000000004005bb <+33>: mov %rax,-0x10(%rbp)
0x00000000004005bf <+37>: mov $0x4006d4,%ecx
0x00000000004005c4 <+42>: mov $0x8,%edx
0x00000000004005c9 <+47>: mov $0x4006d9,%esi
0x00000000004005ce <+52>: mov $0x4006df,%edi
0x00000000004005d3 <+57>: callq 0x400490 <__assert_fail@plt>
End of assembler dump.
Breakpoint 1, main () at foo.c:8
8 assert(d == NAN);
(gdb) p d
$1 = nan(0x8000000000000)
---
Interestingly this always fails: "assert(NAN == NAN);".
Is this a bug in the compiler or the implementation? If not, can there be a warning about such? I'm using an old "gcc-4_3-branch revision 152973".
Regards,
Ulrich