
こんばんは。
以下のプログラムで値がおかしくなる理由、改善方法を教えて頂けませんでしょうか。
double a,b,c;
scanf("%f",&a);
scanf("%f",&b);
c = a + b;
printf("%f",c);
これを実行すると、正しい値が出力されません。
int型で宣言し、整数表示の%dに変更すると問題なく値が出力されます。
また、予めdouble型で宣言した変数a,bに実数の初期値(8.5等)を格納しておくと正しい値が出力されます。
どなたかご回答よろしくお願い致します。
No.2
- 回答日時:
%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% …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語(プログラミング)関連の質...
-
2次元配列 CXX0030とい...
-
C言語 初心者です
-
C言語の型による処理速度の違い
-
C言語における複素数の四則演算...
-
【C言語】二階微分方程式をル...
-
2次方程式の解を求めるプログ...
-
C言語で台形公式を使った二重積...
-
指数形式で入力するには
-
カウントアップタイマ
-
doubleの変数にintとintの割り...
-
割り算ができない
-
ceilでの切り上げ処理について
-
C++で外積
-
バイナリから実数を取得したい...
-
浮動小数点の誤差のあわせ方
-
C++初心者です。簡単なスコア計...
-
平均を求めるプログラムを作っ...
-
実数型の変数に値を入力した計...
-
2÷3などの余りについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C 開放してるのにエラー(doubl...
-
至急です! マクロ定義で #defi...
-
C言語を実行すると-infが出てき...
-
C言語の型による処理速度の違い
-
c言語で、繰り返し文の中で、0....
-
C言語 関数プロトタイプ宣言の...
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
-1.#IND00と出てしまうのですが...
-
c言語のプログラミングについて...
-
C言語で台形公式を使った二重積...
-
C言語でdouble型の小数点の引き...
-
C言語のプログラムで#include<m...
-
2次方程式の解を求めるプログ...
-
C言語の複素数についてです。
-
doubleは常に%lfとするべきなのか
-
関数におけるif文とreturn文に...
-
difftime()について
-
int とdoubleの比較
おすすめ情報