Énorme différence.
Comme son nom l'indique, a doublea 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.floatdoublefloat
Voici comment le nombre de chiffres est calculé:
doublea 52 bits de mantisse + 1 bit caché: log (2 53 ) ÷ log (10) = 15,95 chiffres
floata 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 floatpeut frapper "l'infini" (c'est-à-dire un nombre spécial à virgule flottante) beaucoup plus facilement que doublepour 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 doublepas 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 intou 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, doubleet 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).