« クマバチ | トップページ | »

2014年12月 9日 (火)

πの近似分数:3

http://yamada-kuebiko.cocolog-nifty.com/blog/2014/12/post-9ca0.html
2014年12月 8日 (月)「πの近似分数:2」
↑ここでは、どのくらいあっているかを、誤差の形で見ました。
でも、ちょっと直感的ではなかった。
で、今回は、πと、近似分数の計算結果の「数」を、左から1桁ずつ取り出して比較していこうと考えました。

↓下がそのプログラムです。
最初のFOR ~ NEXT ループで、数を左から1桁ずつ取り出して、配列に収めて、比較する、という作業をしています。
一致しない桁に出会ったら、その桁を kに記録し出力して、ループを脱出してしまいます。
その後、数を k桁まで再構成して出力しています。

!************************************************
!近似分数を計算し、どこまで合っているか表示する
!1000桁モードで実行のこと。
!πの値を100桁保持する。
!Ver.2
!************************************************
OPTION BASE 0
LET MAX = 100
DIM a(MAX), b(MAX)

LET n = 3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679

!*****プログラム動作の確認ために使った分数***********
!LET p = 256839923861488782607902790348837497679
!LET q =  81754686931803956266412424933874257924
!LET p = 76324089682448756762
!LET q = 24294712299901695663
!LET p=355
!LET q=113
!****************************************************
PRINT "p / q"
INPUT PROMPT "p = ":p
INPUT PROMPT "q = ":q

LET m = p / q

FOR i = 0 TO MAX
   LET a(i) = INT(n)
   LET n = 10 * (n - a(i))
   LET b(i) = INT(m)
   LET m = 10 * (m - b(i))

   IF (a(i)<>b(i))THEN
      LET k = i
      PRINT k
      EXIT FOR
   END IF
NEXT i

LET aa = 0
LET bb = 0
LET wrk = 1
FOR i = 0 TO k
   LET aa = aa + a(i) * wrk
   LET bb = bb + b(i) * wrk
   LET wrk = wrk / 10

   !LET aa = aa + a(i)/10^i
   !LET bb = bb + b(i)/10^i
NEXT i
PRINT aa
PRINT bb

END

★実行例
p / q
p = 355
q = 113
7
3.1415926
3.1415929

p / q
p = 333
q = 106
5
3.14159
3.1415

p / q
p = 22
q = 7
3
3.141
3.142

お分かりのように、違いが見つかった桁の位置を示していますので、355/113 なら7-1=6で、小数点以下6桁まで一致している、と読んでください。

★では、今回の所期の目的、「30桁合っている」というのと「38桁合っている」というのにトライ!
p / q
p = 428224593349304
q = 136308121570117
30
3.141592653589793238462643383279
3.141592653589793238462643383275

p / q
p = 76324089682448756762
q = 24294712299901695663
38
3.14159265358979323846264338327950288419
3.14159265358979323846264338327950288413

なるほど。平山氏の著書では整数部「3」まで含めて「一致桁数」としているのでした。
再確認ですが、上のプログラム実行例で、「38」「30」という数字の意味は、一致しなくなる小数点以下の桁を示しています。
ですから、「小数点以下」「29桁一致」「37桁一致」というのが、普通の言い方ではないかと思います。

★オマケ
プログラム中に書き込んである「長たらしい数字」は
http://www.finetune.co.jp/~lyuka/technote/fract/
ここで仕入れた数字です。
私のプログラムで実行すると
p / q
p = 256839923861488782607902790348837497679
q = 81754686931803956266412424933874257924
78
3.141592653589793238462643383279502884197169399375105820974944592307816406286208
3.1415926535897932384626433832795028841971693993751058209749445923078164062862
こうなりまして、「小数点以下77桁」一致するようです。

★まだ続きがあります。
今回は、πや近似分数の割り算結果を、「数」として扱って比較しました。
ひょっとして、πや割り算の結果を「文字=数字」として扱っても同じことができるのではないか、と考えています。
結果として特に新しいことは生まれないはずですが、同じことを別のやり方でも考えられる、ということを実践してみたくなりました。しばらくお待ちください。
「数」と「数字」というのは、なかなかに微妙なものです。

« クマバチ | トップページ | »

理科おじさん」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« クマバチ | トップページ | »

2021年5月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31          
サイト内検索
ココログ最強検索 by 暴想
無料ブログはココログ