And*_*ock 6 c c++ floating-point 64-bit portability
我正在将我的应用程序从32位移植到64位.目前,代码在两种架构下编译,但结果不同.由于各种原因,我使用浮动而不是双打.我假设在一台机器上有一些从浮动到双重的隐式上转换而不是另一台机器.有没有办法控制这个,或者我应该寻找特定的陷阱?
编辑添加:
32位平台
gcc (GCC) 4.1.2 20070925 (Red Hat 4.1.2-33)
Dual-Core AMD Opteron(tm) Processor 2218 HE
Run Code Online (Sandbox Code Playgroud)
64位平台
gcc (Ubuntu 4.3.3-5ubuntu4) 4.3.3
Intel(R) Xeon(R) CPU
Run Code Online (Sandbox Code Playgroud)
应用-mfpmath = 387有点帮助,在算法的1次迭代之后,值是相同的,但除此之外,它们再次失去同步.
我还应该补充一点,我关心的不是结果不一样,而是移植到64位平台已经发现了32位依赖,我不知道.
Edw*_*ETT 10
您的编译器可能正在使用SSE操作码在64位平台上执行大多数浮点运算(假设为x86-64),而出于兼容性原因,它可能在之前使用FPU进行大量操作.
SSE操作码提供更多寄存器和一致性(值始终保持32位或64位大小),而FPU尽可能使用80位中间值.因此,您最有可能从这种改进的中间精度中受益.(注意额外的精度可能导致不一致的结果,如x == y但cos(x)!= cos(y)取决于计算发生的距离!)
您可以尝试使用-mfpmath = 387作为64位版本,因为您正在使用gcc进行编译,并查看您的结果是否与32位结果相匹配,以帮助缩小范围.
浮点数和双精度数在32位和64位代码之间没有固有的需要,但它们经常需要.您的问题的答案将是平台和编译器特定的,因此您需要说明您正在移植的平台以及移植到的平台.
在intel x86平台上,32位代码通常使用x87协处理器指令集和浮点寄存器堆栈以实现最大兼容性,而在amb64/x86_64平台上,通常使用SSE*指令和xmm*寄存器.它们具有不同的精度特性.
发布编辑:
鉴于您的平台,您可能需要考虑在x86_64构建上尝试-mfpmath = 387(i386 gcc的默认值),以查看这是否解释了不同的结果.您可能还需要查看所有-fmath-*编译器开关的设置,以确保它们与两个版本中所需的匹配.