2017-02-25 39 views
-1

这里是我的代码的一部分(I缩影它):2计算机得到不同的输出

#include <iostream> 
#include <cmath> 
#include <iomanip> 

int main() 
{ 
    double pi = M_PI; 
    long long x = 12026548095792; 
    std::cout << std::fixed << std::setprecision(8) << pi * x; 
} 

我的计算机的输出是:

37782515145784.46100000 

(视窗7 64,处理器:英特尔(R )Core(TM)i3-2328M CPU @ 2.20ghz)。
但是,当我跑我的SPOJ代码,输出是

37782515145784.46093750 

(集群:多维数据集(英特尔G860))。
请帮我解释一下这个问题。

更新:我用codeblocks 16.01,gcc版本5.3.0。

+1

也发布编译标志 – Mikhail

+0

也许像http://christian-seiler.de/projekte/fpmath/或https://gcc.gnu.org/wiki/FloatingPointMath可能会解释发生了什么。如何解决这个问题取决于你使用的特定编译器和一组目标平台。 – SergGr

+0

谢谢你的帮助。 –

回答

1

双的精度为15位,所以这两个数字是相同的(他们在自己的“垃圾部分”不同)

这很可能是由于对如何FP单元内部工作(可能是80位)以及传递给FP单元时如何处理两倍(可能通过零填充精度过剩或通过简单地将垃圾运送得更快)

也许还有一种方式M_PI是定义事项。 你试过类似acos(-1)的东西吗?

一般来说,不要期望FP计算是准确的,并且无处不在。

相关问题