gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:50:36 25 4
gpt4 key购买 nike

为什么以下代码在每次 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)已设置。

最佳答案

这是因为浮点格式通常面向保留一定数量的有效数字。

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

使用具有较小数值的 std::ios::fixed 格式会强制格式化输出插入一堆不重要的“前导”零(小数点后)。这就是您在测试程序的输出中真正看到的内容。这是以截断实际有效数字为代价的,当 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 之后会发生什么关闭指定位数后的所有内容。

关于c++ - 为什么我在每次 std::nexttoward 函数调用中得到相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46480811/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com