机器Epsilon精度差异

Machine Epsilon precision discrepancy

本文关键字:精度 Epsilon 机器      更新时间:2023-10-16

作为学校作业的一部分,我正试图计算C++中doubles和float的机器epsilon值。我在Windows7中使用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机器出现差异?

CPU的浮点寄存器通常包含80位,看起来Cygwin编译器选择完全在寄存器中执行循环计算(打印结果时仅将结果截断为32/64位)。

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

附言:欢迎来到StackOverflow,如果你阅读了答案中的概念,你可能会比班上其他人学到更多关于处理器体系结构和编译器的知识!:-)