新しく質問する

実数型の変数に値を入力した計算結果がおかしくなる理由

役に立った:1件
  • 質問者:black-S
  • 投稿日時:2009/11/15 23:00
  • 困り度:すぐに回答が欲しいです
  • 友達に紹介
  • ブログに書く
  • 教えて!gooお気に入り

こんばんは。

以下のプログラムで値がおかしくなる理由、改善方法を教えて頂けませんでしょうか。

double a,b,c;
scanf("%f",&a);
scanf("%f",&b);
c = a + b;
printf("%f",c);

これを実行すると、正しい値が出力されません。

int型で宣言し、整数表示の%dに変更すると問題なく値が出力されます。
また、予めdouble型で宣言した変数a,bに実数の初期値(8.5等)を格納しておくと正しい値が出力されます。

どなたかご回答よろしくお願い致します。

この質問への回答は締め切られました。
このQ&Aは役に立ちましたか?(役に立った:1件)
  • 参考になった:0件

%f は float型(単精度浮動小数点型)を扱うフォーマット指定子なので、 %lf と長さ修飾子 l(エル) を付加して倍精度浮動小数点型(=double)であることを示さなければいけません。小数点数型はビットを 符号部・仮数部・基数部 に分けて考えます。float型とdouble型では仮数部と基数部のビット数が違うので、double型をfloat型として扱うと変な結果になるのです。が、C言語では可変長引数で渡される値は暗黙的に精度の高い方に変換されるんです(floatならdoubleに)。なので、可変個引数でfloatが渡されようがdoubleが渡されようがかわらないので、printfでは%fでも%lfでも同じように扱われ、printfでは%fとしていしてもOKなわけです。scanfでは普通に%fだと&a,&bはfloat型へのポインタとして扱われるので、%lfを指定しないとなりません。というわけで、

double a,b,c;
scanf("%lf",&a);
scanf("%lf",&b);
c = a + b;
printf("%f",c); //printf("%lf",c); でも結果は同じ

とすれば正しく表示されると思います。

長さ修飾子について
http://ja.wikipedia.org/wiki/Printf#.E9.95.B7.E3 …
printfとscanfの違い (可変個引数の扱われ方) について
http://www.ei.fukui-nct.ac.jp/~t-saitoh/edu/Prog …
浮動小数点数型について
http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95% …

通報する

  • 参考になった:0件

No.1ベストアンサー20pt

  • 回答者:jgk
  • 回答日時:2009/11/15 23:16

printfではdouble、floatどちらでも%fですが、
scanfではdoubleは%lf、floatは%fです。

通報する

  
このQ&Aは役に立ちましたか?(役に立った:1件)

このページのトップへ

Facebook公式ページ

公式Twitter