2011-02-01 19 views
2

こんにちは私は長い倍精度でいくつかの計算をしようとしており、私はsqrt()関数からINFを取得しています。sqrt()が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

'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

実際はそうです。 doubleで表現するには大きすぎる数値がdoubleにキャストされると、それはINFINITYになります。 –

関連する問題