2017-06-10 5 views
4

0.5 est une puissance (négative) de 2, ce qui signifie qu'il est exactement représentable par le format à virgule flottante binaire IEEE-754. En toute précision, il est 0'01111110'00000000000000000000000. Basé sur mes tests rapides avec des optimisations désactivées (-O0), il s'avère que si y = 0.5 * x, alors y + y == x. Mais est-ce toujours garanti par la norme IEEE-754?Peut-on dire que c'est toujours vrai que 0.5 * x + 0.5 * x == x?

Je sais qu'en général, si n est un pouvoir entier positif de 2 et m = 1.0/n, y = m * x, puis en ajoutant y ensemble n fois ne produit pas x. Mais il semble que oui avec n = 2.

Quelque chose me manque?

+1

Copie possible de [Est-ce que le calcul à virgule flottante est rompu?] (Https://stackoverflow.com/questions/588004/is-floating-point-math-broken) – mehulmpt

+4

@mehulmpt Cette question concerne environ 0.2 + 0.1! = 0.3', qui, étant donné que '0.2' et' 0.1' ne sont pas exactement représentables par un format à virgule flottante binaire est totalement évident. Je pense que vous ne comprenez pas la différence ici. – plasmacel

Répondre

6

Non, voici un exemple trivial avec compteur double flottants de précision:

double x = 4.9E-324; // minimum positive value 
double y = x * 0.5; // this doesn't only look like a zero this positive zero all 0 bits 
bool test = y + y == x; // false 

nombres à virgule flottante sous précision IEEE-754 ont limité, et nous pouvons perdre des informations lors de la division par 2. Dans la plupart des cas, lorsque vous augmentez la précision du nombre, vous pouvez diminuer l'exposant, mais comme ci-dessus, ce n'est pas toujours suffisant. Parfois, vous ne pouvez pas diminuer l'exposant. Tout ce qui a un exposant minimal et une mantisse impaire ne tiendra pas l'égalité. Un tel exemple est x = 5.0E-322.

+0

Eh bien oui, la valeur min est un contre-exemple en effet. – plasmacel

+1

tout avec un exposant minimal et mantisa impair. essayez 5.0E-322 –

+0

Nice! Ajoutez ceci aussi à la réponse. – plasmacel