これは、ANSI Cコードです:このコードのdouble&long double:コンピュータ上で同じですか?
float x = 3.14159264351134890172;
double y = 3.14159264351134890172;
long double z = 3.14159264351134890172;
printf("%f\n",x);
printf("%f\n",y);
printf("%f\n",z);
printf("%.20f\n",x);
printf("%.20f\n",y);
printf("%.20f\n",z);
出力は次のとおりです。
3.141593
3.141593
3.141593
3.14159274101257324219
3.14159264351134881466
3.14159264351134881466
は、最後の出力行を参照してください。私はlong double
が小数点以下19桁の精度を与えることを読んだ。しかし、ここで私は小数点以下15桁の精度を取得します。私のコンピュータにはdouble
とlong double
の間に違いはありません。 CentOSでlinuxカーネル2.6.32-358.el6.x86_64
を使用しています。 私のCコンパイラはgcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC)
なぜそうですか?それがコンピュータのハードウェア/アーキテクチャに依存する場合、どのように長い倍精度が倍精度よりも大きい私のLinuxマシンを購入するのですか? 私のCコンパイラにも依存しますか?はいの場合、Cコンパイラはどのように選択しますか?
float
の場合、値の範囲は1.2E-38 to 3.4E+38
です。ぜんぜんわかりません。上の例から、float
変数に3.1415926のような小数の10進数を正しく格納することはできません。マシンは変数float
に3.141592しか正しく格納されません。だから私は最後の7桁を失ってしまった。ここは6だ。それでは、なぜfloat
の範囲が1.2 * 10^-38であるのでしょうか?
私は10^-38まで保存することはできませんが、float
の変数は10^-6まで保存できますか?
これはx64で期待されています。なぜあなたは二倍で十分ではないと感じますか?浮動小数点がどのように動作するかは理解できませんが、コメントで判断してください。あなたはそれを続行する前に置く必要があります。値は仮数と指数として格納されていることを知る必要があります。 –
あなたはそれをあまりにも過度に思っています。もしあなたが 'long double'精度で戦っているなら、代わりに別のアプローチを使うべきです。また、 ''%.20Lf "'で 'long double'を表示してください。 – DeiDei
'z'を'%Lf'でフォーマットしなければなりません(ただし、 'sizeof(double)== sizeof(long double)'ならばそれを使うことになります)。 –