√2 5万桁出力成功

 投稿者:たろさ  投稿日:2016年10月21日(金)12時45分53秒
  !PiRamanujan.BAS の計算時間と精度確認の目的で作成

! √2 5万桁出力
OPTION ARITHMETIC RATIONAL
LET t0=TIME
LET s=SQRT(2)
!PRINT USING"#." & REPEAT$("#",999): s
LET TM=TIME-t0
PRINT USING"####." & REPEAT$("#",2):TM;
PRINT "秒"

LET t0=TIME
LET s=s-1
PRINT "1."
PRINT "[";STR$(1)&"-";STR$(1000)&"]"
PRINT
DO
   LET s=s*10
   LET b=INT(s)
   LET cc=cc+1
   IF MOD(cc,5)=0 THEN PRINT STR$(b)&" "; ELSE PRINT STR$(b);
   IF MOD(cc,50)=0 THEN PRINT
   IF MOD(cc,1000)=0 THEN
      PRINT
      PRINT "[";STR$(cc+1)&"-";STR$(cc+1000)&"]"
      PRINT
   END IF
   LET s=s-b
LOOP UNTIL cc>5E4-1

PRINT

LET TM=TIME-t0
PRINT USING"####." & REPEAT$("#",2):TM;
PRINT "秒"

END

EXTERNAL FUNCTION SQRT(n)
OPTION ARITHMETIC RATIONAL
LET x=n      !SQR(x)
LET z=0.5
LET a=(1+x)*z
LET b=x/a
DO
   LET c=(a+b)*z
   LET d=x/c
   LET a=c
   LET b=d
   LET aa=ROUND(a,50001)
   LET bb=ROUND(b,50001)
LOOP UNTIL aa=bb
LET SQRT=b
END FUNCTION
--------------------------------------

設定はLET s=SQRT(x) 欠点は数値が増大すると計算が遅くなる

有効桁数の設定
   LET aa=ROUND(a,50001)
   LET bb=ROUND(b,50001)

出力桁数の設定
LOOP UNTIL cc>5E4-1

計算時間 79.57秒 出力時間 303.22秒

■ パソコン環境
 ウィンドウズ : Microsoft Windows 8.1
 サービスパック : なし
 システムの種類 : 32 ビット
 プロセッサー : AMD Athlon(tm) 64 Processor 3800+
 周波数 : 2.40 GHz
 メモリー : 3.00 GB

出力時間を速くする方法を模索しています。

精度確認 ルート2 (square root of 2)

http://blogs.yahoo.co.jp/donald_stinger

 

Re: √2 5万桁出力成功

 投稿者:nagram  投稿日:2016年10月22日(土)11時20分18秒
  たろささんへのお返事です。

ROUND関数は有数モードでは時間がかかるのでABS(a-b)で精度の判定をしました。1桁の平方根を求めるならこの方法が早いですが、xが数桁以上の場合は時間がかかるのでROUND関数を使いa,bの分母子を精度以上の長さにしないよう工夫する必要があると思います。
出力にはTextWindowを利用しました。PRINT文の出力よりはるかに速いです。

! √2 5万桁出力
OPTION ARITHMETIC RATIONAL
LET t0=TIME
LET s=SQRT(2)
!PRINT USING"#." & REPEAT$("#",999): s
LET TM=TIME-t0
PRINT USING"####." & REPEAT$("#",2):TM;
PRINT "秒"

LET t0=TIME
OPEN #1: TextWindow1
ERASE #1
LET s=s-1
PRINT #1: "1."
PRINT #1: "[";STR$(1)&"-";STR$(1000)&"]"
PRINT #1
DO
   LET s=s*10
   LET b=INT(s)
   LET cc=cc+1
   IF MOD(cc,5)=0 THEN PRINT #1: STR$(b)&" "; ELSE PRINT #1: STR$(b);
   IF MOD(cc,50)=0 THEN PRINT #1
   IF MOD(cc,1000)=0 THEN
      PRINT #1
      PRINT #1: "[";STR$(cc+1)&"-";STR$(cc+1000)&"]"
      PRINT #1
   END IF
   LET s=s-b
LOOP UNTIL cc>5E4-1
CLOSE #1
PRINT

LET TM=TIME-t0
PRINT USING"####." & REPEAT$("#",2):TM;
PRINT "秒"

END

EXTERNAL FUNCTION SQRT(x)  !SQR(x)
OPTION ARITHMETIC RATIONAL
LET d=10^(-50001)  ! 精度(小数点以下d桁)
LET z=0.5
LET a=(1+x)*z
LET b=x/a
DO
   LET a=(a+b)*z
   LET b=x/a
LOOP UNTIL ABS(a-b)<d
LET SQRT=b
END FUNCTION


裏技的ですが、平方根の数字の並びを知りたいだけなら有理数モード専用関数INTSQRを利用するのが手っ取り早いと思います。(INTSQR関数の精度は公表されていないので注意)

OPTION ARITHMETIC RATIONAL
LET a=2
LET s=INTSQR(a*10^100000)  ! 50000桁
PRINT s
END
 

Re: √2 5万桁出力成功

 投稿者:たろさ  投稿日:2016年10月23日(日)01時37分25秒
  > No.4136[元記事へ]

nagramさんへのお返事です。

ありがとうございます。6秒で計算が終わりました。

円周率10万桁の出力成功 経過時間:1日と11時間4分1秒

どの程度速くなるのか、楽しみです。

http://blogs.yahoo.co.jp/donald_stinger

 

戻る