双倍精度太高
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;
但是如果我启动此代码,我每次都会得到类似的数字。哪里有机器的不准确?为什么这么准确?如何进行这样的计算,会导致很大的不准确?
您误解了浮点精度的含义。这意味着存储在浮点变量(float
或double
(中的值不需要与数学分配/计算的值完全相同的值。发生这种情况是因为并非所有数学实数都可以用浮点类型表示。
这并不意味着当您在同一台计算机上的同一构建上对相同的值执行相同的指令时,您将获得不同的结果。
例如,整数值16,777,217
不能用 IEE 754 浮点数表示。所以在
float a = 16'777'217;
a
在某种意义上是"不准确的",因为它不是16'777'217
,但它总是具有相同的"不准确"。
我需要获取一个随机值
然后使用 C++11 随机库。
没有不准确,因此没有随机性。
就像整数是实数的近似值一样,浮点数也是如此。浮点数在实数上的分布在对数空间中是均匀的,就像整数的分布在实空间中均匀一样。
当你写一个像1.234
这样的数字并将其分配给double
时,会选择最接近1.234
double
。这与将其分配给选取最接近 0int
的int
不同。但原理是一样的。
当你计算nump / 10;
时,浮点标准(例如IEEE754(通常要求选择最接近结果double
。
如果需要伪随机数,请使用属于C++标准库的相应函数。
如果你想要真正的随机数,并且非常丰富,那么你可以获得一些硬件来生成它们,否则你可以使用别人的硬件:例如 https://qrng.anu.edu.au/
相关文章:
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 正在将csv文件读取为双精度矢量
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 如何在C++中的同一函数中使用字符串和双精度
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 如何计算具有指定类型的表达式的相对精度和绝对精度
- 如何打印boost多精度128位无符号整数
- 检查是否以特定精度给出双精度
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- C 字符串返回字符串的整数/双精度/长整型值
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- 如何使双精度值的 C++ 和 C# 中的结果相同
- 使用浮点数和双精度数的非常小数字的数学
- 使用 Xcode 将双精度存储在数组C++中
- 为什么输出精度没有正确舍入?
- 在 C++ 中将双精度变量写入二进制文件
- 如何从字符串转换为双精度*