ここから本文です

c言語について。 この①と②の結果が違う理由を教えて下さい。

アバター

ID非公開さん

2019/9/2221:47:24

c言語について。
この①と②の結果が違う理由を教えて下さい。

#include<stdio.h>
int main(void) {
float sum1 = 0;
float sum2 = 0;
for(int i = 1; i <= 10000; i++) { //// ← ①
sum1 += 1./(i * i);
}
for(int i = 10000; i >= 1; i--) { //// ←②
sum2 += 1./(i * i);
}
printf("%f vs %f¥n", sum1, sum2);
return 0;
}

閲覧数:
31
回答数:
2

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

yah********さん

2019/9/2222:11:05

桁落ちですね。

①は、大きい値が入っているsum1に、最後の方は
小さい値を足すので、誤差が大きくなります。

②は、sum2に足す値は、どんどん大きな値を足すので、
誤差が小さくなります。

ベストアンサー以外の回答

1〜1件/1件中

2019/9/2309:55:50

例えば、8桁表示の電卓を使っていたとして、
0.5と10000000を足したらどうなるでしょう。
10000000.5...表示は8桁しかないので.5は切られてしまって、10000000が結果として得られるでしょう。

つぎに、0.5と0.5と10000000を足し合わせることを考えてみて下さい。
0.5 + 0.5 で1になります。そこに10000000を足せば10000001になります。
しかし、順番を変えて
10000000+0.5を先に計算すると10000000です。さらに0.5を足しても、やっぱり10000000です。


C言語のfloat型は(電卓とはちょっと切り方が違いますが)大抵7桁程度までしか計算出来ないのが普通です。質問のプログラムではiが1~10000まで変化しますから、1/100000000から1までを足す段階において、上記のような現象が起こって、値が違ってきます。

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる