作为学校作业的一部分,我试图计算C++中双倍和浮动的机器epsilon值。我在Windows 7中使用Cygwin,64位,下面是代码:
#include <iostream>
int main() {
double epsilon = 1;
while(1 + epsilon > 1)
epsilon = epsilon / 2;
epsilon = 2*epsilon;
std::cout << epsilon << std::endl;
float epsilon_f = 1;
while(1 + epsilon_f > 1)
epsilon_f = epsilon_f / 2;
epsilon_f = 2*epsilon_f;
std::cout << epsilon_f << std::endl;
return 1;
}当我运行代码时,我收到两个值的1.0842e-019。我查了一下,双值应该是2.22e-16,浮点值应该是1.19e-07。当我在Macbook上运行完全相同的代码时,代码会返回正确的值。是什么导致了我的Windows机器上的差异?
发布于 2015-02-06 02:14:43
CPU的浮点寄存器通常包含80位,看起来Cygwin编译器选择完全在寄存器中执行循环计算(打印结果时只将结果截断到32/64位)。
正如@Potatoswatter所指出的,这对于编译器来说是完全合法的,而且您的程序实际上表现出未定义的行为,因为它假定存在精度限制。由于存在未定义的行为,编译器可能会选择将程序转换为它想要的任何东西(包括删除所有文件的程序,但幸运的是,这不是一个常见的解决方案.)
欢迎来到StackOverflow,并提出一个问题(如果你阅读了答案中的概念),它可能会让你比班上的任何人更多地了解处理器架构和编译器!:-)
https://stackoverflow.com/questions/28357415
复制相似问题