Une énorme différence.
Comme son nom l'indique, un double
a deux fois la précision de float
[1] . En général, un double
a une précision de 15 chiffres décimaux, alors que float
a 7.
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 l'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 même, la valeur maximale du flotteur est d'environ 3e38
mais double est à peu près 1.7e308
donc en utilisant float
peut atteindre "l'infini" (c'est-à-dire un nombre spécial à virgule flottante) beaucoup plus facilement que double
pour quelque chose de simple, par exemple calculer la factorielle de 60.
Pendant les tests, il se peut que quelques cas de test contiennent ces énormes nombres, ce qui peut faire échouer vos programmes si vous utilisez des flottants.
Bien sûr, parfois, même double
n'est pas assez précis, c'est pourquoi nous avons parfois des long double
[1] (l'exemple ci-dessus donne 9.000000000000000066 sur Mac), mais tous les types de virgule flottante souffrent du problème suivant erreurs d'arrondi Donc, si la précision est très importante (par exemple, pour le traitement de l'argent), vous devez utiliser la méthode suivante int
ou une classe de fractionnement.
En outre, n'utilisez pas +=
pour additionner beaucoup de nombres à virgule flottante, car les erreurs s'accumulent rapidement. Si vous utilisez Python, utilisez fsum
. Sinon, essayez de mettre en œuvre la Algorithme de sommation de Kahan .
[1] : Les standards C et C++ ne spécifient pas la représentation de float
, double
y 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
es en effet, un nombre à virgule flottante IEEE à simple précision (binary32), et double
es un nombre à virgule flottante IEEE à double précision (binaire64).