机器Epsilon精度差异

时间:2015-02-06 02:03:39

标签: c++ double precision epsilon

我正在尝试计算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上运行 exact 相同的代码时,代码返回正确的值。什么可能导致我的Windows机器出现差异?

1 个答案:

答案 0 :(得分:2)

The CPU's floating-point registers typically contain 80 bits,看起来Cygwin编译器选择完全在寄存器中执行循环计算(在打印结果时仅将结果截断为32/64位)。

正如@Potatoswatter所指出的,这对于编译器来说是完全合法的,并且您的程序实际上表现出未定义的行为,因为它假定 是精度限制。由于存在未定义的行为,编译器可能会选择将您的程序转换为它想要的任何内容(包括删除所有文件的程序,但幸运的是这不是常见的解决方案......)

P.S。欢迎来到StackOverflow,并且感谢一个问题(如果您阅读了答案中的概念),可能会让您了解有关处理器架构和编译器的更多信息,而不是同类课程中的任何人! : - )