
こんばんは。
以下のプログラムで値がおかしくなる理由、改善方法を教えて頂けませんでしょうか。
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ランキング
-
プログラムでの数字につく”f”の...
-
関数におけるif文とreturn文に...
-
c言語で、繰り返し文の中で、0....
-
C言語初心者 構造体 課題について
-
-1.#IND00と出てしまうのですが...
-
実数型の変数に値を入力した計...
-
C言語を実行すると-infが出てき...
-
float型とdouble型の変数の違い...
-
プログラミングについての質問...
-
方程式を2分法を用いて解くプロ...
-
C言語の複素数についてです。
-
main.c:7:43: warning: implici...
-
「Aに対するBの割合」と「Aに対...
-
Aの値からBの値を除するとは??
-
Enterキーを押されたら次の処理...
-
有効数字について 以前質問をし...
-
「指定されたキャストは有効で...
-
20'(角度)の計算がわかりま...
-
複数桁10進数の*桁目だけを抽出...
-
信頼区間の1.96や1.65ってどこ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
C言語を実行すると-infが出てき...
-
doubleの変数にintとintの割り...
-
float型とdouble型の変数の違い...
-
c言語で、繰り返し文の中で、0....
-
至急です! マクロ定義で #defi...
-
C 開放してるのにエラー(doubl...
-
C言語の型による処理速度の違い
-
C言語 関数プロトタイプ宣言の...
-
float と double
-
ラグランジュの補間法のCプログ...
-
C言語のプログラムで#include<m...
-
c言語のコンパイルエラー canno...
-
2分法で方程式の複数の解を自...
-
2次方程式の解を求めるプログ...
-
C言語で台形公式を使った二重積...
-
Cプログラミングの問題です。ニ...
-
物体が往復する動きを作りたい
-
関数におけるif文とreturn文に...
-
doubleは常に%lfとするべきなのか
おすすめ情報