最低的双重正值 - 可以库特改变其价值

Lowest double positive value - can cout change its value?

本文关键字:改变      更新时间:2023-10-16

请考虑以下两个代码 - 它们之间的唯一区别是一个单个cout,它打印值EPS:
http://ideone.com/0beehz-在这里,该程序进入和无限循环,因为在代表EPS之后,EPS之后将价值更改为0

#include <iostream>
int main()
{
    double tmp = 1.;
    double eps;
    while(tmp != 0) {
        eps = tmp;
        tmp /= 2.;
    }
    if(eps == 0) {
        std::cout << "(1)eps is zero!n";
    }
    std::cout << "eps before: " << eps;
    if(eps == 0) {
        std::cout << "(2)eps is zero!n";
    }
    while(eps < 1.) {
        tmp = eps;
        eps *= 2.;
        if(tmp == eps) {
            printf("wtf?n");
        }
    }
    std::cout << "eps after: " << eps;
}


http://ideone.com/pi4d30-在这里,我已经评论了cout。

#include <iostream>
int main()
{
    double tmp = 1.;
    double eps;
    while(tmp != 0) {
        eps = tmp;
        tmp /= 2.;
    }
    if(eps == 0) {
        std::cout << "(1)eps is zero!n";
    }
    //std::cout << "eps before: " << eps;
    if(eps == 0) {
        std::cout << "(2)eps is zero!n";
    }
    while(eps < 1.) {
        tmp = eps;
        eps *= 2.;
        if(tmp == eps) {
            printf("wtf?n");
        }
    }
    std::cout << "eps after: " << eps;
}


因此,一个cout的一个cout更改了逻辑,非常令人惊讶。为什么?

我认为这是第5节(表达式)的情况,第11段

浮动操作数的值和浮动表达式的结果可以比类型所要求的更精确和范围;类型没有更改。

在工作中,参见。原始代码的这种变化。

while(tmp != 0) {
    eps = tmp;
    tmp /= 2.;
}

以扩展精度进行的计算和比较。循环一直运行,直到eps是最小的正扩展值(可能是80位x87扩展类型)。

if(eps == 0) {
    std::cout << "(1)eps is zero!n";
}

仍处于扩展精度,eps != 0

std::cout << "eps before: " << eps;

为了转换为打印字符串,eps存储并转换为double精度,导致0。

if(eps == 0) {
    std::cout << "(2)eps is zero!n";
}

是的,现在是。