¿Cómo imprimir el doble valor grande con una precisión de 10 en lenguaje C (C99)?
double d1 = 1100200300400500600.0000000001; double d2 = 1100200300400500600.0000000001; double d3 = d1 + d2; printf("???", d3);
Espera tener salida: 2200400600801001200.0000000002
Necesitas usar una biblioteca de precisión arbitraria para c.
Si vas a almacenar enteros, puedes usar el GMP
.
Si va a almacenar grandes valores de punto flotante, le recomendaría que utilice el MPFR
, una biblioteca que admite tipos de punto flotante. El MPFR
se basa en el GMP
.
Debe verificar cómo se almacenan los puntos flotantes en C. C99 implementa IEEE754. Esto le da 11 bits para exponente y 52 bits para mantisa. Solo son esos 52 bits que puedes usar para representar el número. Exponente te dice dónde estará el punto flotante.
Simplemente no puede almacenar un número tan grande con precisión dada en el doble.
El código de OP no está asignando exactamente el valor como se percibe. double
solo puede representar un conjunto finito de números. Utilizará el doble representable más cercano . Normalmente, el double
puede representar con precisión al menos los primeros 15 dígitos decimales de significación, o 110020030040050xxxx.xxxx
1100200300400500600.0000000001
encuentra entre dos double
:
1100200300400500480
y
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
Con el punto flotante típico, para imprimir el valor exactamente , use
printf("%a\n", d3);
Para imprimir un double
en decimal con suficiente precisión para distinguir todo double
, use
printf("%.e\n", DBL_DECIMAL_DIG - 1, d3);
No es tan simple. Te sugiero que uses una biblioteca como GMP . Sé que no es exactamente lo que estás buscando, pero la respuesta, como dije, no es tan simple como parece.
Por supuesto, puedes codificarte las operaciones, y es una buena práctica (si quieres matar el tiempo). 🙂