2011-02-01 4 views
2

Привет Я пытаюсь выполнить некоторые вычисления с длинными удвоениями, и я получаю INF из функции sqrt().sqrt() return INF

Код:

#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; 
} 

Спасибо!

ответ

7

sqrt принимает и возвращает double. Когда вы его назовете, ваш long double будет преобразован в double, который не может хранить такое большое число и, таким образом, получит значение бесконечности.

Используйте sqrtl, который принимает и возвращает long double.

+0

Работал нормально! Но я не нашел ссылок на sqrtl(), это стандартная функция? –

+0

@Murilo: да, по крайней мере, для C99. – ninjalj

+0

С man-страницы 'sqrtf',' sqrt' и 'sqrtl' она, по-видимому, является стандартной для C99 и POSIX.1-2001. –

1

sqrt вернет INFINITY, если аргумент INFINITY; например:

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

Но аргумент не INFINITY. –

+2

Собственно, это так. Когда число, слишком большое, чтобы представлять в двойном, бросается в двойное, оно становится INFINITY. –