gpt4 book ai didi

c++ - 为什么std::uniform_real_distribution无法生成正确的浮点值?

转载 作者:行者123 更新时间:2023-12-01 15:04:54 25 4
gpt4 key购买 nike

我正在尝试打印随机float(32位)值。我为此目的尝试使用uniform_real_distribution。我写了下面的代码,

int main()
{
std::random_device rd{};
std::mt19937 gen{rd()};

std::uniform_real_distribution<float> dist(-1e18,1e18);

float random_val = dist(gen);

printf("%.20f\n", random_val);

return 0;
}
现在,输出结果很奇怪。我得到的是非常大的数字(总是接近上限或下限),没有分数。以下是我看到的一些输出,
-149399166081040384.00000000000000000000
128349565723082752.00000000000000000000
-323890424458510336.00000000000000000000
802221481969844224.00000000000000000000
817395979383734272.00000000000000000000
他们总是像这样,如果我改变界限也没关系。怎么了

最佳答案

float通常是IEEE Single-precision floating-point format,它的工作方式类似于科学计数法,具有1个符号位,8个指数位和23 + 1个分数位。
因此817395979383734272.0作为1.41795599 * 2 ^ 59存储在内存中。小数部分只有〜8个十进制数字,因为这是它可以压缩为〜24位的全部精度。 Mark Ransom提醒我,结果是,所有大于约100,000,000的float都是整数,只是因为它们不够用,所以不能存储任何小数部分。
由于小数部分约为24位,这意味着它可以保留7.2个十进制数字的精度。因此,将float呈现为文本时,前7个十进制数字是准确的,第8个十进制数字是半准确的,而随后的十进制数字实际上是随机的。

817395979383734272.0
^ ^^
| |basically random
| semi-accurate
accurate
对于 double(使用 IEEE Double-precision floating-point format),它使用1个符号位,11个指数位和52 + 1个分数位。这将精确存储15.9个十进制数字,因此仍可以保留小数部分,直到值大于〜1,000,000,000,000,000。
David Shwartz还指出,通常会假设随机浮点数会有一些小数目和一些大数,但是从数学上讲,几乎所有均匀随机生成的浮点数都将在最大值的两个数量级之内。您的情况是> 1e16和<-1e16。这在数学上是正确的,但也可能导致您的困惑。

关于c++ - 为什么std::uniform_real_distribution无法生成正确的浮点值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63038655/

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