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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分 1 2022/07/19 17:03
- C言語・C++・C# 至急お願いします。プログラミングの問題です。 最初に正の整数nの入力を受け付け、次に分数の分子と分母 3 2022/07/19 17:09
- C言語・C++・C# 至急教えてください!プログラミングの問題です。 割られる整数と割る整数を受け取って、商と余りを出力す 3 2022/07/05 10:23
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# 至急教えてください。プログラミングの問題です。 malloc関数を使ってください!お願いします! 最 1 2022/07/21 09:28
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
C言語の関数と配列に関する質問
C言語・C++・C#
-
gccを行ってもexeファイルが生成されない
C言語・C++・C#
-
これなにがちがうんですか??
C言語・C++・C#
-
-
4
WindowsのCapsLock(キャップスロック)って、何の意味があるんですか?
C言語・C++・C#
-
5
質問失礼します。 プログラム言語を一つも知らないのですが、C♯の勉強をしてみたいです。おすすめの教材
C言語・C++・C#
-
6
C言語 バッファについて。
C言語・C++・C#
-
7
gcc13.2のバグ?
C言語・C++・C#
-
8
[C言語]fputsとfprintfの違い
C言語・C++・C#
-
9
C言語について。
C言語・C++・C#
-
10
こんなことてしますか??
C言語・C++・C#
-
11
C言語です
C言語・C++・C#
-
12
C言語関数違いについて。
C言語・C++・C#
-
13
VisualStudio2022でC言語プログラムで全角文字を使用すると不明なエラーが表示される
C言語・C++・C#
-
14
c言語
C言語・C++・C#
-
15
Notepad++の関数リスト表示でC言語のプログラムが正しく表示できない。
C言語・C++・C#
-
16
あなたは、Excelはどうやって学びましたか?
C言語・C++・C#
-
17
mallocについて
C言語・C++・C#
-
18
C言語をコンパイルするとコンピュータ上でどう動くかというコードになるみたいな説明をよく聞くのですがこ
C言語・C++・C#
-
19
Javaって使いますか、もう古いですか?C++とどっちがいいですか?分析でC++使う授業ありましたけ
C言語・C++・C#
-
20
C言語について
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
正負を反転させて出力するプロ...
-
数字以外が入力されたらエラー...
-
ワードで文字を入力する時の変...
-
*をユーザーが入力した数字の数...
-
scanfが2回使えない・・・?;
-
Linuxで入力待ちなしkeyread関...
-
入力値が1以下、かつ数字以外の...
-
プログラム(C)
-
java初心者です。入力されたの...
-
java 入力された文字列を数値に...
-
プログラミングの問題です 「金...
-
"scanf"でエンターで改行させな...
-
getchar()について 教えてくだ...
-
プログラミング初心者です。 Py...
-
c言語でひらがなのしりとりをで...
-
Userformの入力順序をタブオー...
-
C言語・標準入力でquitを入力で...
-
IF文で戻ることはできますか?...
-
scanf関数 バッファに残ったエ...
-
プログラムC言語の整数の約数に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
double型が正常に認識されてい...
-
プログラミング初心者です。 Py...
-
正負を反転させて出力するプロ...
-
Excel VBAで、Application.Inpu...
-
C言語について。
-
batプログラム上で文字列を入力...
-
*をユーザーが入力した数字の数...
-
cout関数を使っているのですが...
-
漢字のソートについて
-
数字以外が入力されたらエラー...
-
Userformの入力順序をタブオー...
-
ワードで文字を入力する時の変...
-
Linuxで入力待ちなしkeyread関...
-
java初心者です。入力されたの...
-
EDITコントロールで入力できる...
-
Eclipseコンソール表示を、リセ...
-
小数か整数かを判定する方法
-
C言語scanf_sで何故か2回入力に...
-
VB.NETで16進数+16進数や16進...
-
Linuxプログラミングで、キーボ...
おすすめ情報