为什么我在每个std :: nexttoward函数调用中得到相同的结果

时间:2017-09-29 02:16:41

标签: c++

为什么以下代码在每个std::nexttoward函数调用中返回相同的数字?

#include <cmath>
#include <iostream>
#include <limits>

int main()
{
    std::cout.precision(std::numeric_limits<double>::max_digits10);
    std::cout.setf(std::ios::fixed);

    auto foo = 0.00000000000011134;
    std::cout << foo << std::endl;

    for (int i = 0; i < 100; ++i)
    {
        foo = std::nexttoward(foo, 1.0);
        std::cout << foo << std::endl;
    }
}

http://coliru.stacked-crooked.com/a/551b6e2b867b2f3b

所有标记here(FE_OVERFLOW,FE_UNDERFLOW和FE_INEXACT)都没有设置。

1 个答案:

答案 0 :(得分:4)

这是因为浮点格式通常用于保留一定数量的 重要 数字。

std::cout.setf(std::ios::fixed);

使用数值较小的std::ios::fixed格式强制格式化输出插入一堆非重要的&#34;前导&#34;零(小数点后)。这是您在测试程序输出中真正看到的内容。这是以截断实际有效数字为代价的,当I / O库必须在固定precision()之后关闭所有内容时。

删除std::ios::fixed格式化标记(并保留precision())后,输出就会达到预期效果(使用gcc 7.2.1 and reproduced on Coliru测试自己):

1.1134e-13
1.1134000000000001e-13
1.1134000000000002e-13
1.1134000000000003e-13
1.1134000000000005e-13
1.1134000000000006e-13
1.1134000000000007e-13
1.1134000000000008e-13
1.113400000000001e-13
1.1134000000000011e-13
1.1134000000000012e-13

...等

将小数点向左移动十三个位置(这是e-13所说的内容),然后自己查看std::ios::fixed在指定的位数后切断所有内容后会发生什么。< / p>