我正试图解决一个跨平台的问题,我不知道该如何解决。下面是一个演示程序:
#include <cmath>
#include <cstdio>
int main()
{
int xm = 0x3f18492a;
float x = *(float*)&xm;
x = (sqrt(x) + 1) / 2.0f;
printf("%f %x\n", x, *(int*)&x);
}在VS2010中编译时,Windows上的输出如下:
0.885638 3f62b92a
使用GCC 4.8.1 (ideone.com样本)编译的输出为:
0.885638 3f62b92b
这些小的不匹配最终导致在需要在多个平台上相同运行的程序过程中出现了一个严重的问题。我更关心的不是“准确性”,而是结果是否匹配。我尝试将VS中的/fp模式从precise切换到strict,但这似乎无法修复它。
在这两个平台上,我还应该考虑哪些其他途径来使这个计算结果相同呢?
UPDATE:有趣的是,如果我这样修改代码,那么它将跨平台匹配:
#include <cmath>
#include <cstdio>
int main()
{
int xm = 0x3f18492a;
float x = *(float*)&xm;
//x = (sqrt(x) + 1) / 2.0f;
float y = sqrt(x);
float z = y + 1;
float w = z / 2.0f;
printf("%f %x %f %x %f %x %f %x\n", x, *(int*)&x, y, *(int*)&y, z, *(int*)&z, w, *(int*)&w);
}但是,我不确定它是否现实,在代码中遍历并像这样更改所有浮点操作!
https://stackoverflow.com/questions/18494237
复制相似问题