c++ - 机器 Epsilon 精度差异

标签 c++ double precision epsilon

作为学校作业的一部分,我正在尝试计算 C++ 中 double 和 float 的机器 epsilon 值。我在 Windows 7 64 位中使用 Cygwin,这里是代码:

#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。我查了一下, double 值应该是 2.22e-16,浮点值应该是 1.19e-07。当我在 Macbook 上运行完全相同的代码时,代码返回正确的值。是什么导致了我的 Windows 机器上的差异?

最佳答案

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

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

附言欢迎来到 StackOverflow,如果您提出的问题(如果您阅读了答案中的概念)可能会让您比类的任何其他人了解更多关于处理器架构和编译器的知识,请点赞! :-)

关于c++ - 机器 Epsilon 精度差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28357415/

相关文章:

c++ - 如何在 C++ 中从 cin 中获取 2 个整数?

iphone - 在 objective-c 中添加两个 double 值的问题

将 double 添加到 long long 时出现 C++ 精度错误

math - float 学坏了吗?

floating-point - 为什么 float 不正确?

c++ - Variadic 模板代码可在 GCC 4.6 上编译,但不能在 clang 或 GCC 4.7 上编译

c++ - 反转字符串。不知道为什么这个逻辑是错误的。 C++

c++ - 在 map C++ 中迭代和使用 find()

java - 异常- java.lang.NumberFormatException : For input string: "000000000"

java - 如何在 Java 中解析字符串并查找 double