Énorme différence.
Comme son nom l'indique, a double
a 2x la précision de [1] . En général, a a 15 chiffres décimaux de précision, alors qu'il en a 7.float
double
float
Voici comment le nombre de chiffres est calculé:
double
a 52 bits de mantisse + 1 bit caché: log (2 53 ) ÷ log (10) = 15,95 chiffres
float
a 23 bits de mantisse + 1 bit caché: log (2 24 ) ÷ log (10) = 7,22 chiffres
Cette perte de précision pourrait entraîner une accumulation d'erreurs de troncature plus importantes lorsque des calculs répétés sont effectués, par exemple
float a = 1.f / 81;
float b = 0;
for (int i = 0; i < 729; ++ i)
b += a;
printf("%.7g\n", b); // prints 9.000023
tandis que
double a = 1.0 / 81;
double b = 0;
for (int i = 0; i < 729; ++ i)
b += a;
printf("%.15g\n", b); // prints 8.99999999999996
De plus, la valeur maximale de float est d'environ 3e38
, mais le double est d'environ 1.7e308
, donc l'utilisation float
peut frapper "l'infini" (c'est-à-dire un nombre spécial à virgule flottante) beaucoup plus facilement que double
pour quelque chose de simple, par exemple le calcul de la factorielle de 60.
Pendant les tests, quelques cas de test contiennent peut-être ces énormes nombres, ce qui peut entraîner l'échec de vos programmes si vous utilisez des flottants.
Bien sûr, parfois, même double
pas assez précis, nous avons donc parfois long double
[1] (l'exemple ci-dessus donne 9.000000000000000066 sur Mac), mais tous les types à virgule flottante souffrent d' erreurs d' arrondi , donc si la précision est très importante (par exemple, l'argent vous devez utiliser int
ou une classe de fraction.
De plus, ne pas utiliser +=
pour additionner beaucoup de nombres à virgule flottante, car les erreurs s'accumulent rapidement. Si vous utilisez Python, utilisez fsum
. Sinon, essayez d'implémenter l' algorithme de sommation de Kahan .
[1]: Les normes C et C ++ ne spécifient pas la représentation de float
, double
et long double
. Il est possible que les trois soient implémentés en double précision IEEE. Néanmoins, pour la plupart des architectures (gcc, MSVC; x86, x64, ARM) float
est en effet un nombre à virgule flottante simple précision IEEE (binaire32), et double
est un nombre à virgule flottante double précision IEEE (binaire64).