1
#include <stdio.h>

int main()
{
    long double n = (long double)1208925819614629174706175; // (1<<80)-1 (generated in python)
    printf("%LG\n",n);
}

これをgccでコンパイルすると、警告が表示されます

test.c:5:31: warning: integer constant is too large for its type [enabled by default]

実行すると、印刷されます-1

を実行するsizeof(long double)と、が出力され12ます。したがって、署名者は(1 << 83)-1long doubleを収容する必要がありますか?

どうすれば正しく動作させることができますか?

PS:私が取り組んでいた元の問題は、12 *(10 18)までの符号付き整数の格納を扱っていました。掛け算、足し算、その他の計算ルーチンは書きたくありません。では、どうすればよいですか?

4

2 に答える 2

2

Longdoubleは10**300以上を処理しますが、これはコンパイラーが不満を言っていることではありません。これは、longにキャストしようとしている整数が整数に対して大きすぎることを示しています。(ヒント-小数点を追加)–スターボリン  

于 2012-06-06T04:12:33.040 に答える
2

スターボリンは正しいですが、この表現の詳細な説明が必要だと思います。

Cでは、数値定数(小数点なし)は、値に応じて、intまたはのいずれかのタイプになります。 使用する定数、は、に対しても大きすぎるため、切り捨てられます。 これはすべて、にキャストして割り当てる前に行われます。 浮動小数点型が登場するとき、数値定数はすでに切り捨てられており、失われたビットを元に戻すことはできません。long
1208925819614629174706175long
long doublen

これは、Cが単純な言語であり、コンパイル中に単純に定義された手順に従うために発生します。コンパイラは、数値定数がにキャストされることを確認するために「先読み」しませんlong double。最初にそれをとして扱いlong、次に進みます。

于 2012-06-06T07:33:15.830 に答える