双倍精度太高

Too much accuracy in double

本文关键字:精度      更新时间:2023-10-16

经过大量操作后,我需要获得一个随机值。我明白了,如果我写,例如 1000000 并将其除以 10 100 次,我应该得到一个几乎随机的数字。

double nump = 1000000000;
cout.precision(45);
for (int i = 1; i <= 100; i++) {
nump = nump / 10;
}
cout << nump;

但是如果我启动此代码,我每次都会得到类似的数字。哪里有机器的不准确?为什么这么准确?如何进行这样的计算,会导致很大的不准确?

您误解了浮点精度的含义。这意味着存储在浮点变量(floatdouble(中的值不需要与数学分配/计算的值完全相同的值。发生这种情况是因为并非所有数学实数都可以用浮点类型表示。

这并不意味着当您在同一台计算机上的同一构建上对相同的值执行相同的指令时,您将获得不同的结果。

例如,整数值16,777,217不能用 IEE 754 浮点数表示。所以在

float a = 16'777'217;

a在某种意义上是"不准确的",因为它不是16'777'217,但它总是具有相同的"不准确"。


我需要获取一个随机值

然后使用 C++11 随机库。

没有不准确,因此没有随机性。

就像整数是实数的近似值一样,浮点数也是如此。浮点数在实数上的分布在对数空间中是均匀的,就像整数的分布在实空间中均匀一样。

当你写一个像1.234这样的数字并将其分配给double时,会选择最接近1.234double。这与将其分配给选取最接近 0intint不同。但原理是一样的。

当你计算nump / 10;时,浮点标准(例如IEEE754(通常要求选择最接近结果double

如果需要伪随机数,请使用属于C++标准库的相应函数。

如果你想要真正的随机数,并且非常丰富,那么你可以获得一些硬件来生成它们,否则你可以使用别人的硬件:例如 https://qrng.anu.edu.au/