ここから本文です

以下のS1 S2 は数学的には対価であるが、浮動小数点演算ではどちらかの式を用いて...

アバター

ID非公開さん

2018/5/600:49:19

以下のS1 S2 は数学的には対価であるが、浮動小数点演算ではどちらかの式を用いて計算するとよいか説明せよ

S1-S2,浮動小数点演算,昇順,降順,対価,printf,どちらか

閲覧数:
47
回答数:
2
お礼:
250枚

違反報告

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

sin********さん

2018/5/1121:51:13

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

1〜1件/1件中

hki********さん

2018/5/621:47:05

S1の方が情報落ちが生じやすいのでS2の方が良い。
例えば、n = 10000, IEEE754単精度形式で計算する場合、
S1 では k > 2¹² の項がすべて無視されるが、
無視された項の総和は
Σ[k=4097→10000]1/k²
> ∫[4097→10001]dx/x²
= -1/10001 + 1/4097
≒ 0.000144
> 2⁻¹³
となるので、結果の仮数部の下位10ビットは当てにならない。
一方、S2 ではすべての項が足し合わされるので、誤差は少ない。

以上でした。
----------
#include <stdio.h>

int main(void)
{
  int n;
  float s;
  float t, r;

// 昇順、補正なし
  s = 0;
  for (n = 1; n <= 10000; n++) {
    s += 1.0/(n*n);
  }
  (void)printf("昇順、補正なし : %f\n", s);

  // 昇順、補正あり
  s = r = 0;
  for (n = 1; n <= 10000; n++) {
    t = s;
    s += 1.0/(n*n);
    r += 1.0/(n*n) - (s - t);
  }
  s += r;
  (void)printf("昇順、補正あり : %f\n", s);

  // 降順、補正なし
  s = 0;
  for (n = 10000; n != 0; n--) {
    s += 1.0/(n*n);
  }
  (void)printf("降順、補正なし : %f\n", s);

  // 降順、補正あり
  s = r = 0;
  for (n = 10000; n != 0; n--) {
    t = s;
    s += 1.0/(n*n);
    r = r + 1.0/(n*n) - (s - t);
  }
  s += r;
  (void)printf("降順、補正あり : %f\n", s);

  return 0;
}
----------
昇順、補正なし : 1.644725
昇順、補正あり : 1.644834
降順、補正なし : 1.644834
降順、補正あり : 1.644834

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

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

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

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

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

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

閉じる

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

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

閉じる