Printf大双值,C高精度

如何在C语言(C99)中以10的精度打印大双精度值?

double d1 = 1100200300400500600.0000000001; double d2 = 1100200300400500600.0000000001; double d3 = d1 + d2; printf("???", d3); 

预计有输出:2200400600801001200.0000000002

您需要为c使用任意精度库。

我要存储整数,你可以使用GMP

如果你要存储大的浮点值,我建议你使用MPFR ,一个支持浮点类型的库。 MPFR基于GMP

您应该检查C中浮点的存储方式.C99实现了IEEE754。 这为指数提供了11位,尾数提供了52位。 它只能用于表示数字的52位。 Exponent告诉您浮点的位置。

你根本无法在double中以给定的精度存储这么大的数字。

OP的代码并不完全按照感知分配值。 double只能代表一组有限的数字。 它将使用最接近的可表示的双精度 。 通常, double可以准确地表示至少前15个表示十进制数字,或110020030040050xxxx.xxxx

1100200300400500600.0000000001介于两个double之间:
1100200300400500480
1100200300400500608

 // Add d1 to the closest representable double. This turns out to be _exactly // 1100200300400500608 double d1 = 1100200300400500600.0000000001; double d2 = 1100200300400500600.0000000001; // adding those 2 result in the _exact // 2200400600801001216 double d3 = d1 + d2; // To print to 10 decimal places printf("%.10f", d3); // 2200400600801001216.0000000000 

使用典型浮点,要准确打印值,请使用

 printf("%a\n", d3); 

要以十进制打印double 精度 ,以足够的精度区分所有double 精度 ,请使用

 printf("%.e\n", DBL_DECIMAL_DIG - 1, d3); 

这不是那么简单。 我建议你使用像GMP这样的库。 我知道这并不是你想要的,但正如我所说,答案并不像看起来那么简单。

当然,你可以自己编写操作代码,这是一个很好的做法(如果你想要杀死一些时间)。 🙂