Gran diferencia.
Como su nombre lo indica, a double
tiene 2 veces la precisión de [1] . En general, a tiene 15 dígitos decimales de precisión, mientras que tiene 7.float
double
float
Así se calcula el número de dígitos:
double
tiene 52 bits de mantisa + 1 bit oculto: log (2 53 ) ÷ log (10) = 15.95 dígitos
float
tiene 23 bits de mantisa + 1 bit oculto: log (2 24 ) ÷ log (10) = 7.22 dígitos
Esta pérdida de precisión podría conducir a la acumulación de errores de truncamiento mayores cuando se realizan cálculos repetidos, por ej.
float a = 1.f / 81;
float b = 0;
for (int i = 0; i < 729; ++ i)
b += a;
printf("%.7g\n", b); // prints 9.000023
mientras
double a = 1.0 / 81;
double b = 0;
for (int i = 0; i < 729; ++ i)
b += a;
printf("%.15g\n", b); // prints 8.99999999999996
Además, el valor máximo de flotante es aproximadamente 3e38
, pero el doble es aproximadamente 1.7e308
, por lo que usar float
puede alcanzar el "infinito" (es decir, un número especial de coma flotante) mucho más fácilmente que double
para algo simple, por ejemplo, calcular el factorial de 60.
Durante las pruebas, tal vez algunos casos de prueba contengan estos números enormes, lo que puede hacer que sus programas fallen si usa flotadores.
Por supuesto, a veces, incluso double
no es lo suficientemente preciso, por lo tanto, a veces tenemos long double
[1] (el ejemplo anterior da 9.000000000000000066 en Mac), pero todos los tipos de coma flotante sufren errores de redondeo , por lo que si la precisión es muy importante (por ejemplo, dinero procesamiento) debe usar int
o una clase de fracción.
Además, no utilice +=
para sumar muchos números de coma flotante, ya que los errores se acumulan rápidamente. Si estás usando Python, úsalo fsum
. De lo contrario, intente implementar el algoritmo de suma Kahan .
[1]: Los estándares C y C ++ no especifican la representación de float
, double
y long double
. Es posible que los tres se implementen como IEEE de doble precisión. Sin embargo, para la mayoría de las arquitecturas (gcc, MSVC; x86, x64, ARM) float
es de hecho un número de coma flotante de precisión simple IEEE (binary32), y double
es un número de coma flotante de precisión doble IEEE (binary64).