
double型を用いて実数を計算するプログラムが正常に動かなかったため、
double型を用いてキーボードから入力した実数を表示させるだけの以下のプログラム(#1)
(#1)
#include <stdio.h>
int main(void) {
double x;
puts("整数を入力せよ:");
printf("x=");
scanf("%f", &x);
printf("入力した値は%fです", x);
return 0;
}
を実験として作ってみたところ、以下のような結果(#2)
(#2)※5.1を入力
整数を入力せよ:
x=5.1
入力した値は0.000000です
を得ました。どうして出力結果が0.000000になるのでしょうか。お教えいただきたいです。
No.5ベストアンサー
- 回答日時:
誤りの源は、scanf で double x に対して %f を指定してしまったことです。
double には %lf を指定すべきです。
%f を指定すると何が起こるかというと...
C は型が厳密でない言語なので、
scanf("%f", &x); の &x は型情報を持たない単なるアドレスとして扱われます。
scanf は入力から小数を表す文字列を読み取り、
それを float 型のビットパターンに変換して、アドレス &x にあるメモリに格納します。
次に printf("%f", x);を行うとき、printf の可変長引数では float も double も
double に変換して渡されることになっています。 今回のコードでは
x が double型なので、何もせず変数 x の中身がそのまま引数として渡されますが、
scanf が入力を float として x に格納しているので、float 形式のビットパターンを
double 形式として解釈したことになり、値が化けてしまいます。
5.1 が 0.000000 に化ける解釈の詳細を理解するには、IEEE754 の規約を読んで
それぞれの浮動小数点形式がどのようなビットパターンになるかを確認する
必要がありますが、今回の誤りを理解するのにそこまでする必要もないでしょう。
No.4
- 回答日時:
float型とdouble型って扱いが違うから指定子も違う
詳しいことは知らないけど0.000みたいになるのは多分実行環境によって変わるだろうからそういう仕様なんでしょって感じじゃないかな。
正規のやり方じゃないから正規の値が出ないってだけで出た値に理由を求めてもしゃあない気がせんでもない。多分調べたら出ますし。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
java初心者です。入力されたの...
-
正負を反転させて出力するプロ...
-
Userformの入力順序をタブオー...
-
Excel VBAで、Application.Inpu...
-
*をユーザーが入力した数字の数...
-
EDITコントロールで入力できる...
-
cout関数を使っているのですが...
-
特定の文字が入力されるまで・・・
-
プログラミング初心者です。 Py...
-
文字列で条件分岐 if swtich
-
入力値チェック
-
C++:cinが上手く使えない
-
scanfが2回使えない・・・?;
-
入力エラーの処理について。
-
Eclipseコンソール表示を、リセ...
-
C++ scanfで止まらない
-
4桁の数字以外を入力したらエラ...
-
scanf関数の戻り値について
-
"scanf"でエンターで改行させな...
-
2進数の1の数を数える問題
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
*をユーザーが入力した数字の数...
-
数字以外が入力されたらエラー...
-
java初心者です。入力されたの...
-
Eclipseコンソール表示を、リセ...
-
正負を反転させて出力するプロ...
-
プログラミング初心者です。 Py...
-
scanfが2回使えない・・・?;
-
Excel VBAで、Application.Inpu...
-
"scanf"でエンターで改行させな...
-
scanf が無視されます
-
C言語 逆ピラミッドの作り方
-
プログラミングの問題です 「金...
-
if文の条件にscanf関数を使うと…?
-
C言語でgetchar();が上手く使え...
-
UWSCで変数をキー入力
-
4桁の数字以外を入力したらエラ...
-
EDITコントロールで入力できる...
-
C言語でつるかめ算をするにはど...
-
Userformの入力順序をタブオー...
-
C言語scanf_sで何故か2回入力に...
おすすめ情報