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