Chr*_*ris 12 c floating-point nan
忽略我为什么要这样做,754 IEEE fp标准没有定义以下行为:
float h = NAN;
printf("%x %d\n", (int)h, (int)h);
Gives: 80000000 -2147483648
Run Code Online (Sandbox Code Playgroud)
基本上,无论我给出的NAN值是多少,它都输出80000000(十六进制)或-2147483648(十进制).是否有这样的原因和/或这是正确的行为?如果是这样,怎么样?
我给它不同的NaN值的方法是: 如何手动设置等于NaN的浮点的位值?
所以基本上,是否存在NaN的有效载荷影响演员输出的情况?
谢谢!
Dan*_*her 11
浮点数的铸造成一个整数的结果未在整数变量(±1为截断)的范围未定义的值.
A NaN超出范围,因此结果未定义.
实际上,该标准仅提到将浮点类型的有限值转换为整数类型.
这种行为是有原因的,但这并不是你应该依赖的东西.
正如您所注意到的,IEEE-754没有指定将浮点NaN转换为整数时会发生什么,除了它应该引发无效的操作异常,编译器可能会忽略该异常.C标准说行为是未定义的,这意味着你不仅不知道你将得到什么整数结果,你不知道你的程序将做什么; 该标准允许程序中止或获得疯狂的结果或做任何事情.您可能在英特尔处理器上执行了此程序,并且您的编译器可能使用其中一个内置指令进行了转换.英特尔非常谨慎地指定指令行为,并且将浮点NaN转换为32位整数的行为是返回0x80000000,而不管NaN的有效负载,这是您观察到的.
因为Intel指定了指令行为,所以如果您知道所使用的指令,则可以依赖它.但是,由于编译器不向您提供此类保证,因此您不能依赖于使用此指令.