一个c ++程序在两个IDE中返回不同的结果

时间:2012-11-29 22:00:30

标签: c++ eclipse gcc codeblocks

我在c++中编写了以下CodeBlocks程序,结果是9183.我再次在Eclipse中编写,运行后返回9220.两者都使用{{1} }。正确的结果是9183.这段代码出了什么问题? 谢谢。 源代码:

MinGW

4 个答案:

答案 0 :(得分:12)

由于CodeBlocks在32位模式下编译并且Eclipse以64位模式编译,您可能会看到精度错误:

$ g++ -m32 test.cpp
$ ./a.out
9183
$ g++ -m64 test.cpp
$ ./a.out
9220

答案 1 :(得分:3)

如果我将两个参数都加倍,我会得到你期望的结果:

pow(static_cast<double>(a), static_cast<double>(b))

答案 2 :(得分:2)

实际上,你并不是真的应该依靠==(或技术上,x <= y && y <= x)进行双打。所以这段代码产生依赖于实现的结果(严格来说不是说UB,每条评论,但我的意思是:))

答案 3 :(得分:2)

差异似乎是由于浮点运算是使用53位精度还是64位精度。如果在循环前面添加以下两行(假设采用英特尔架构),它将使用53位精度,并在编译为32位应用程序时给出9220结果:

uint16_t precision = 0x27f;
asm("fldcw %0" : : "m" (*&precision));

FPU的第8位和第9位控制此精度。以上将这两位设置为10。将它们设置为11会产生64位精度。而且,为了完整起见,如果将位设置为00(值0x7f),则大小将打印为9230