精度误差为双精度

Precision error in double

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

使用%Lf打印时会更改一个大的双精度值以下组合中的值可给出正确的结果小数前9位/小数后6位例如,用%Lf打印的十进制数之前有9位数字的值输入:3435537287.32输出:3435537287.320000

一旦我将十进制之前的数字增加到10,用%Lf打印的值就会添加垃圾值。例如,用%Lf打印的小数前10位的值输入:34355372871.3487输出:34355372871.348701从上面的输出中可以看出,输入值发生了变化。

对于g++/xlc++,是否有任何编译时选项可以使用,以便不更改值?

::代码段::

double d2 =  34355372871.3487; 
double d4 =  3435537287.3487; 
printf("d2 = %lfn", d2); 
printf("d4 = %lfn", d4); 

谢谢,Hudson

简短解释:您需要长双

long double d2 =  34355372871.3487L; 
long double d4 =  3435537287.3487L; 
printf("d2 = %Lfn", d2); 
printf("d4 = %Lfn", d4);

详细解释:你的有效位占用了很多空间;-)以下是浮点值中使用的位。

//Type       Sign  Exponent Significand Total bit 
//Double        1        11          52        64 
//Long Double   1        15          64        80

请记住,十进制中的每个数字大约需要3.3位(log(10)/log(2))所以52位/3.3~15-16位。

它是双精度。双精度存储为64位(8字节)。

(http://en.wikipedia.org/wiki/Double-precision_floating-point_format)

它使用52位作为尾数,1位作为信号,11位作为指数。

然后,52位尾数给出15–17位有效十进制数字的精度。

由于浮点数字的精度有限,并非每个(或实际上只有少数)十进制浮点文字都与现有的二进制表示形式完全对应。

每个文字都映射到最接近的现有值。每种浮点类型都会发生这种情况,但对于精度较高的类型,这种情况就不那么明显了,因为有更多不同的数字。