首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >编译器之间的浮点不匹配(Visual 2010和GCC)

编译器之间的浮点不匹配(Visual 2010和GCC)
EN

Stack Overflow用户
提问于 2013-08-28 17:15:57
回答 8查看 8.5K关注 0票数 8

我正试图解决一个跨平台的问题,我不知道该如何解决。下面是一个演示程序:

代码语言:javascript
运行
复制
#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:有趣的是,如果我这样修改代码,那么它将跨平台匹配:

代码语言:javascript
运行
复制
#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);
}

但是,我不确定它是否现实,在代码中遍历并像这样更改所有浮点操作!

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18494237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档