Pourquoi ma division float est-elle désactivée à 0,00390625?

float a=67107842,b=512; float c=a/b; printf("%lf\n",c); 

Pourquoi c 131070.000000 au lieu de la valeur correcte 131070.00390625?

Le type float votre compilateur utilise probablement le format simple précision IEEE 754 32 bits.

67107842 est un nombre binary de 26 bits:

  11111111111111110000000010 

Le format à simple précision représente la plupart des nombres sous la forme 1.x multiplié par une puissance (positive ou négative) égale à deux, où 23 bits sont stockés après la place binary, le 1. tête étant implicite (les très petits nombres sont une exception).

Mais 67107842 nécessiterait 24 bits après la place binary (à indiquer sous la forme 1.111111111111111000000001 multipliée par 2 25 ). Comme il n’ya que de la place pour stocker 23 bits, le dernier 1 est perdu. C’est donc la valeur dans a qui est fausse dans ce cas, pas la division – a contient en réalité 67107840 ( 11111111111111110000000000 ), qui correspond exactement à 131070 * 512.

Vous pouvez voir cela si vous imprimez aussi:

 printf("%lf %lf %lf\n", a, b, c); 

donne

 67107840.000000 512.000000 131070.000000 

Essayez de changer a et c pour qu’il soit de type “double”, plutôt que float. Cela vous donnera une meilleure précision. (Les flotteurs ont environ 6 chiffres ou plus; les doubles ont plus du double.)

Un float utilise généralement une représentation simple précision 32 bits IEEE-754 et ne convient que pour environ 6 chiffres décimaux significatifs. Un double est bon pour 15, et lorsqu’il est pris en charge, un long double 80 bits donne 20 chiffres significatifs.

Notez que sur certains compilateurs, il n’y a pas de distinction entre double et long double , ni même aucun support pour long double .

Une solution consiste à utiliser une bibliothèque numérique à précision arbitraire ou à utiliser une bibliothèque à virgule flottante décimale plutôt que le support de virgule flottante binary intégré. La virgule flottante décimale n’est pas insortingnsèquement plus précise (bien que souvent ces bibliothèques prennent en charge des types plus volumineux et plus précis), mais n’affichera pas les artefacts qui se produisent lors de l’affichage d’une représentation décimale d’une valeur à virgule flottante binary. La virgule flottante décimale risque également d’être beaucoup plus lente, car elle n’est généralement pas implémentée dans le matériel.