綾小路龍之介の素人思考

[c言語]自然数の逆数の和について

僕は今まで自然数Nの逆数をN回足し算すれば1になると思っていました。でもそれは嘘だとわかったんです。1分の1を1回足し算、2分の1を2回足し算、とやっていくと7分の1を7回足し算した結果は1ではないということがわかりました。僕らがよく知っている数学的な常識は、逐次計算による丸め込みの誤差によっていとも簡単に破壊されてしまうようです。

#include <stdio.h>
int main(){
        unsigned int i;
        unsigned int N = 32;
        for( i=1 ; i<=N ; i++ ){
                unsigned int j;
                double iInv = (double)1 / (double)i;
                double Sum  = 0;
                for( j=1 ; j<=i ; j++ ){
                        Sum += iInv;
                }
                double Delta = Sum - (double)1;
                if( Delta ){
                        printf("%d\t%.100le",i,Delta);
                }
        }
        return(1);
}
 7  1
 Σ --- = 1
j=1 7

というわけで理由を考えてみようと思う。まずは7を2進数であらわす。

    7 = 4*1 + 2*1 + 1*1
7(10) = 111(2)

その次に7の逆数を作りたいんだけど。

    0.1428571428...
  -----------------
7 ) 1.000000000
    0.000000000
   ---
    1.0
    0.7
   ----
    0.30
    0.28
   -----
    0.020
       14
    ------
        60
        56
    -------
         40
         35
    --------
          50
          49
    ---------
           10
            7
    ----------
            30
            28
    -----------
            20
            14
    ------------
              60
              56

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2007-06-22T00:04:21+09:00
  2. Modified: 2007-06-22T15:16:13+09:00
  3. Generated: 2017-08-09T23:09:26+09:00