変数の代わりに浮動小数点定数が渡されると、なぜ%fは大きな値を出力するのですか?


9

指定されたプログラムで、printfs ごとに異なる結果が得られたのはなぜですか?

#include <stdio.h>
int main()
{
    float c = 4.4e10;
    printf("%f\n", c);
    printf("%f\n", 4.4e10);
    return 0;
}

また、次の出力が表示されます。

44000002048.000000
44000000000.000000

4
これまでの答え4.4e10は、doubleそれがfloatの初期化で変換される定数であるがcdoubleに渡されたときにとして保持される定数であることを説明していprintfます。ただし、fサフィックスを追加するとfloat定数が一定になることも知りたい場合があります。印刷で4.4e10fは、cへの初期化の結果と同じ値が表示されます4.4e10ffloat定数とdouble定数を区別することは、浮動小数点演算で質の高い作業を行う上で重要です。
Eric Postpischil

この変換方法に名前は付けられていますか?それについて読みたいです。
user10056563

C言語でからdoubleへの変換がいつ行われるかを知りたいfloatですか?または、変換からどのような値が得られるか、つまり、変換がどのような影響を与えるかを知りたいですか?または、他の何か?
Eric Postpischil、

私は疑問だどちらも、ここでの回答標準をしかし、私は若い頃と学習C我々が使用printf("%f",x)のためにfloatprintf("%lf",x)のためにdouble。物事はいつ変わりましたか?そして、どのように一つは考え明示的に(シングル)のprintf float- printf("%hf",x)??
Adrian Mole、

2
%lfprintfの@Adrianはと同じです%ffloat変数の引数のa は、aがに変換さdoubleれるのと同じように、コンパイラによってshortに変換されますint
SSアン

回答:


9

Aはfloat定数が、32ビット浮動小数点数を保持するタイプで4.4e10表すdouble64ビットの浮動小数点数を保持するが、(すなわち、A ダブル -precision浮動小数点数)

に割り当てる4.4e10c、値4.4e10を正確に表すことができず(仮数と呼ばれるパラメーターの丸め誤差)、最も近い可能な値(44000002048)が格納されます。に渡されるprintfと、丸め誤差を含めてに昇格されdoubleます。

2番目のケースでは、値は、double狭めたり広げたりせずに、全体の時間であり、a doubleが値を正確に表すことができる場合です。

これが望ましくない動作である場合は、もう少し精度をcとして宣言できますdouble(ただし、最終的に精度の制限に達することに注意してください)。


3

ここでは実際に2つの異なるタイプの値を出力しています。

最初のケースでは、型の変数に値を割り当てていますfloat。aの精度floatはおよそ6桁または7桁の10進数であるため、値を正確に表現できない場合は、その型で表現できる最も近い値が表示されます。

2番目のケース4.4e10では、typeを持つ定数を渡していますdouble。この型の精度は約16桁で、値はその範囲内にあるため、正確な値が出力されます。


なぜ最後に2048を印刷するのですか?
user10056563

@ user10056563これは、32ビットフロートに格納できる4.4e10に最も近い数値だからです。
dbush
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.