所以我理解C++中浮点数与双精度数的区别。
double 只是一个双浮点数,而 float 是一个单浮点数(精度大小的两倍)。
我的问题是,为什么浮点数表示为“300000011920928955078125e-24”(对于值 3.0),但双精度数会简单地显示为 3.0?
为什么不双重显示所有尾随数字?它具有更高的精度,但仍然具有与浮点相同的有限精度,所以我不确定为什么它不会像那样显示。
所以我理解C++中浮点数与双精度数的区别。
double 只是一个双浮点数,而 float 是一个单浮点数(精度大小的两倍)。
我的问题是,为什么浮点数表示为“300000011920928955078125e-24”(对于值 3.0),但双精度数会简单地显示为 3.0?
为什么不双重显示所有尾随数字?它具有更高的精度,但仍然具有与浮点相同的有限精度,所以我不确定为什么它不会像那样显示。
这是因为许多值不能用浮点数精确表示(单精度或双精度),但 double 可以表示更接近的值。如果您打印显示更多小数位,您几乎肯定会看到错误。
值 0.3 无法精确表示。此外,计算结果可能会从操作数中提取错误。“0.3 * 10”会放大结果中的误差,所以不会是精确的 3.0。
最好的模拟是尝试以十进制显示“1/3”。你可以写成 0.333333 或 0.333333333333。如果将它们乘以 3,您将得到 0.999999 或 0.999999999999。在计算器屏幕上显示那些(具有固定位数),第一个将显示错误,而第二个将被四舍五入。
编辑:代码来证明这一点:
#include <stdio.h>
int main()
{
float f = 0.3;
double d = 0.3;
printf("%.50lf %.50lf\n", f, d);
printf("%.10lf %.10lf\n", f, d);
}
显示:
0.30000001192092895507812500000000000000000000000000 0.29999999999999998889776975374843459576368300000000
0.3000000119 0.3000000000