2013-04-29 5 views
5

Consultez le code suivant snippetY at-il un élément neutre IEEE754 en ce qui concerne plus

double id = ?; 
double res; 
long unsigned *res_u = (long unsigned*)&res; 

long unsigned i; 
for (i = 0; i < (long unsigned)-1; i++){ 
    double *d1 = (double*)&i; 
    res = id + *d1; 
    assert(*res_u == i); 
} 

Ma question: Y at-il une valeur pour id, de sorte que l'affirmation est valable pour tous i? En d'autres termes pour les mathématiciens parmi nous: y a-t-il le double qui est l'élément neutre pour l'addition?

+0

Comme 0 ou -0 ou NAN ou Infinity ou -Infinity? –

+0

@MichaelDorgan + inf + (-inf) rend NaN, donc ni l'un ni l'autre ne peut être neutre. –

+0

Oui, votre réponse est correcte. J'essayais juste de confirmer la question. Votre -0 réponse est belle. –

Répondre

7

-0. est paradoxalement la valeur en virgule flottante qui sert de point neutre pour l'addition.

+0. est presque, mais -0. + (+0.) rend +0..

En dehors de cela, +inf + (-0.) fait +inf, -inf + (-0.) fait -inf et NaN + (-0.) fait NaN.

+6

En supposant l'arrondi par défaut. Si vous définissez le mode d'arrondi sur round-to-moins-infini, '+ 0.' est neutre. –

+0

Qu'en est-il de la normalisation? Est-ce que vous vous attendez à quelque chose d'étrange, quand vous faites 'r = d + (- 0.)'? – niklasfi

+0

@niklasfi: aucune normalisation ne se produit lorsque vous ajoutez zéro. –