linux – 从x86函数返回时,信令NaN已损坏(x87的flds / fstps)
发布时间:2020-12-14 00:30:29 所属栏目:Linux 来源:网络整理
导读:我对x86(32位) linux gcc有奇怪的行为.我使用gcc的内置__builtin_nansf(“”)生成信令NaN,生成0x7fa00000.从函数float返回此值后,将其修改为0x7fe00000.有一个简短的例子: #include stdio.hfloat f = __builtin_nansf("");float y;float func (void){ retur
我对x86(32位)
linux gcc有奇怪的行为.我使用gcc的内置__builtin_nansf(“”)生成信令NaN,生成0x7fa00000.从函数float返回此值后,将其修改为0x7fe00000.有一个简短的例子:
#include <stdio.h> float f = __builtin_nansf(""); float y; float func (void) { return f; } int main (void) { printf("%xn",*((int*)&f)); y = func(); printf("%xn",*((int*)&y)); } 用gcc-4.6.2 program.c编译的程序,其输出: 7fa00000 7fe00000 GDB: (gdb) p/x f $2 = 0x7fa00000 ... (gdb) si 0x08048412 in func () 1: x/i $pc 0x8048412 <func+14>: flds -0x4(%ebp) (gdb) x/x $ebp-4 0xbfffeb34: 0x7fa00000 (gdb) si (gdb) info all-regis st0 nan(0xe000000000000000) (raw 0x7fffe000000000000000) ... //after return from func (gdb) si 0x0804843d in main () 1: x/i $pc 0x804843d <main+38>: fstps 0x804a024 (gdb) si (gdb) x/x 0x804a024 0x804a024 <y>: 0x7fe00000 为什么我的信号NaN被修改了?我该如何防止这种修改? 解决方法
我不确定你能阻止这个.装上的x87的SNAN通常引发无效异常,然后将该值转换为QNAN,通过设定(23位)的尾数的MSB.也就是说,OR’ing为0x00400000.
从Intel? 64 and IA-32 Architectures Software Developer Manuals开始,第1卷,第4.8.3.4节描述了sNan / qNan处理.第8章介绍X87 FPU编程.第3卷,第22.18页还描述了X87 FPU如何处理NaN. 我没有看到X87控制字中的任何位会产生您希望进行sNaN传播的行为. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |