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这样的库。 我知道这并不是你想要的,但正如我所说,答案并不像看起来那么简单。
当然,你可以自己编写操作代码,这是一个很好的做法(如果你想要杀死一些时间)。 🙂