6 votes

Le bug du calculateur Google, est-ce que le passage de float à double pourrait être une raison possible ?

Avec la nouvelle incapacité de Google à faire des mathématiques correctement (vérifiez-le! selon Google 500,000,000,000,002 - 500,000,000,000,001 = 0), j'ai pensé essayer ce qui suit en C pour tester une petite théorie.

int main()
{
   char* a = "399999999999999";
   char* b = "399999999999998";

   float da = atof(a);
   float db = atof(b);

   printf("%s - %s = %f\n", a, b, da-db);

   a = "500000000000002";
   b = "500000000000001";
   da = atof(a);
   db = atof(b);
   printf("%s - %s = %f\n", a, b, da-db);
}

Lorsque vous exécutez ce programme, vous obtenez ce qui suit

   399999999999999 - 399999999999998 = 0.000000
   500000000000002 - 500000000000001 = 0.000000

Il semblerait que Google utilise une simple précision flottante sur 32 bits (l'erreur ici), si vous remplacez float par double dans le code ci-dessus, vous résolvez le problème! Est-ce que cela pourrait être la solution?

0voto

DrPizza Points 9355

Vrai. Je n'ai pas tenu compte des encodages dupliqués. Il y a en fait 252-1 NaNs pour les doubles et 223-1 NaNs pour les singles, cependant. :p

Doh, j'ai oublié de soustraire les infinis.

0voto

John Meagher Points 6734

La version de l'estimation approximative de ce problème que j'ai apprise est que les flottants sur 32 bits vous donnent 5 chiffres de précision et les flottants sur 64 bits vous donnent 15 chiffres de précision. Cela variera bien sûr en fonction de la façon dont les flottants sont encodés, mais c'est un point de départ assez bon.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X