为什么以下代码在每个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)都没有设置。
答案 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>