2011-02-01 5 views
2

Salut J'essaie de faire des calculs avec de longs doubles et j'obtiens INF de la fonction sqrt().sqrt() retournant INF

code:

#include <math.h> 
#include <stdio.h> 

int main() 
{ 
    long double bigNUMBER; 
    long double p1,p2,p3; 
    long double p4; 

    p1 = 4.769547e+155; 
    p2 = 1.012994e+170; 
    p3 = 1.714812e+169; 

    p4 = p1*p1 + p2*p2 + p3*p3; 

    bigNUMBER = sqrt(p4); 

    printf("product: %Lf\n\n", p4); // 1055562645989439942507809393771156765931135... 

    printf("\n result %Lf\n\n", bigNUMBER); // INF 

    return 0; 
} 

Merci!

Répondre

7

sqrt prend et renvoie un double. Quand vous l'appelez, votre long double sera converti en un double qui ne peut pas stocker un si grand nombre, et aura ainsi la valeur de l'infini.

Utilisez sqrtl qui prend et renvoie un long double.

+0

A bien fonctionné! Mais je n'ai trouvé aucune référence pour sqrtl(), est-ce une fonction standard? –

+0

@Murilo: oui, au moins pour C99. – ninjalj

+0

A partir de la page de manuel 'sqrtf',' sqrt' et 'sqrtl', il est apparemment standard par C99 et POSIX.1-2001. –

1

sqrt renverra également INFINITY lorsque l'argument est également INFINITY; par exemple:

#include <stdio.h> 
#include <math.h> 
int main() 
{ 
    printf("%g %g\n", INFINITY, sqrt(INFINITY)); 
    return 0; 
} 
+2

Mais l'argument n'est pas INFINITY. –

+2

En fait, c'est. Quand un nombre trop grand pour représenter en double est converti en double, il devient INFINITY. –