Printf gran valor doble con alta precisión en C

¿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). 🙂