質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

1047閲覧

C言語の計算結果が疑問です

marymills

総合スコア18

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2019/01/15 07:28

Cで作成されたソースで計算結果がよくわかりません

バイナリファイルを読み込んでR、c、d、E、Dを求めeとfを計算してます

printf("Rは %f\n",R);
printf("Eは %f\n",E);
printf("Dは %f\n",D);
printf("cは %d\n",c);
printf("dは %d\n",d);
e = (R + c * E) / D;
f = (R + d * E) / D;
printf("eは %f\n",e);
printf("fは %f\n",f);

出力結果
Rは 839.896912
Eは 0.250000
Dは 1.000000
cは 2480
dは 2474
eは 1459.896973
fは 1458.396973

電卓でもEXCELでも
eは1459.896912
fは1458.396912となりなぜ上記の計算結果になるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takabosoft

2019/01/15 07:53

各変数の「型」が判るようにソースを修正してください。
guest

回答4

0

単精度浮動小数点数(float型)の有効数値は十進で約7桁です。つまり、8桁目以降はゴミです。
倍精度浮動小数点数(double型)にすれば十進で約15桁の有効数値を持ちます。

投稿2019/01/15 07:39

otn

総合スコア84507

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marymills

2019/01/17 01:07

詳しくありがとうございます。桁数の違いで計算結果が異なると勉強になりました
guest

0

C言語では、2進数により小数点以下を表現しているため、ニンゲンが計算する10進数の計算結果とはずれが発生します
「浮動小数点 誤差」でぐぐってみればいいかと。

投稿2019/01/15 07:34

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

e と f が float で定義していませんかね。

gcc で試したらこうなりました。

C

1 double R = 839.896912; 2 double E = 0.250000; 3 double D = 1.000000; 4 int c = 2480; 5 int d = 2474; 6 7 printf("R is %f\n", R); 8 printf("E is %f\n", E); 9 printf("D is %f\n", D); 10 printf("c is %d\n", c); 11 printf("d is %d\n", d); 12 13 double e = (R + c * E) / D; 14 double f = (R + d * E) / D; 15 printf("e is %f\n", e); 16 printf("f is %f\n", f); 17 18 float e2 = (R + c * E) / D; 19 float f2 = (R + d * E) / D; 20 printf("e2 is %f\n", e2); 21 printf("f2 is %f\n", f2);
R is 839.896912 E is 0.250000 D is 1.000000 c is 2480 d is 2474 e is 1459.896912 f is 1458.396912 e2 is 1459.896973 f2 is 1459.396973

投稿2019/01/15 08:05

編集2019/01/15 08:21
tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marymills

2019/01/17 01:03

float とdoubleで計算結果が違うのですね。わかりました。 ありがとうございました。
guest

0

どこかの変数がfloatになっている、ということはありませんか?(doubleとは精度が違うので、結果も異なってきます)

投稿2019/01/15 07:35

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問