新しく発言する  EXIT  インデックスへ

1000桁モードでの数値演算の桁あふれ


  1000桁モードでの数値演算の桁あふれ 山中和義 2008/07/28 20:24:41 
1000桁モードでの数値演算の桁あふれ  返事を書く  ノートメニュー
山中和義 <drdlxujciw> 2008/07/28 20:24:41
下記の2つのプログラム(πをn桁もとめる)で動作が異なります。

プログラム1では、n=194以上で桁あふれが発生します。


●プログラム1

OPTION ARITHMETIC decimal_high
!OPTION ARITHMETIC RATIONAL

INPUT PROMPT "計算したい桁数 ": n
PRINT "円周率を";n;"桁求める。"

LET q1 = 1
LET r1 = 180
LET t1 = 60
LET i1 = 2

FOR i = 1 TO n
LET u1 = 3 * (3 * i1 + 1) * (3 * i1 + 2)
LET y1 = INT((q1 * (27 * i1 - 12) + 5 * r1) / (5 * t1) )

PRINT USING "#": y1;

LET q2 = 10 * q1 * i1 * (2 * i1 - 1)
LET r2 = 10 * u1 * (q1 * (5 * i1 - 2) + r1 - y1 * t1) !<-----
LET t2 = t1 * u1
LET i2 = i1 + 1

LET q1 = q2
LET r1 = r2
LET t1 = t2
LET i1 = i2
NEXT i

END



●プログラム2

OPTION ARITHMETIC decimal_high
!OPTION ARITHMETIC RATIONAL

PUBLIC NUMERIC n

INPUT PROMPT "計算したい桁数 ": n
PRINT "円周率を";n;"桁求める。"

CALL g(1,180,60,2)

PRINT
PRINT PI !検算

END


EXTERNAL SUB g(q,r,t,i)
OPTION ARITHMETIC decimal_high
!OPTION ARITHMETIC RATIONAL
LET u=3*(3*i+1)*(3*i+2)
LET y=INT((q*(27*i-12)+5*r)/(5*t))
PRINT USING "#": y;
IF i>n THEN EXIT SUB
CALL g(10*q*i*(2*i-1), 10*u*(q*(5*i-2)+r-y*t), t*u, i+1)
END SUB
  KK62526です。 KK62526 2008/07/29 22:00:17 
  │└この件が解決した後、報告しようと思ってい... 山中和義 2008/07/30 10:10:51 
  │ └的確なご指摘、どうもありがとうございます... KK62526 2008/07/31 08:30:34 
  1000桁モードでの数値の指数部の扱いが構文... 山中和義 2008/07/30 10:02:43 
  │└現象の解析、どうもありがとうございました... KK62526 2008/07/31 08:31:32 
  再帰的な書き方に慣れるために KK62526 2008/08/01 00:28:51 

 インデックスへ  EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。