新しく発言する EXIT インデックスへ
多倍長数のLOGの計算

  多倍長数のLOGの計算 会社員 2007/04/30 10:54:29  (修正1回)
  !続き1 会社員 2007/04/30 10:55:44 
  !続き2 会社員 2007/04/30 10:58:37 
  !続き3 会社員 2007/04/30 10:59:42 
  一般論ですが,有理数モードで計算して誤差... 白石 和夫 2007/04/30 14:02:24 
  Re:多倍長のLOG 河川屋 2007/05/03 22:34:03 
  バグの箇所がわかりました。 会社員 2007/05/04 23:34:48 
  │├DELETED  会社員  2007/05/05 00:05:41  (削除)
  │├DELETED  会社員  2007/05/05 00:09:15  (削除)
  │├DELETED  会社員  2007/05/05 15:33:09  (削除)
  │├DELETED  会社員  2007/05/05 15:34:14  (削除)
  │└小数点以下の場合に誤動作していたところを... 会社員 2007/05/16 23:03:53 
  │ ├!続き 会社員 2007/05/16 23:04:58 
  │ └!続き2 会社員 2007/05/16 23:05:47 
  LOG(π)の結果です。 会社員 2007/05/16 23:10:37 

  多倍長数のLOGの計算 会社員 2007/04/30 10:54:29  (修正1回) ツリーへ

多倍長数のLOGの計算 返事を書く ノートメニュー
会社員 <qiekrrepwd> 2007/04/30 10:54:29 ** この記事は1回修正されてます
多倍長数のLOGのプログラムを作成中です。

8桁あたりまで正しくでてきているのですが、
それ以降が正しくでてこないようです。

もし、バグの理由がわかれば教えてください。

下記は、log5 を 100桁求める場合の試験プログラムです。

! 多倍長のLOG計算 10桁区切り
!
! log(N)= 2{ (N-1)/(N+1) + (N-1)/(N+1)^3/3 + (N-1)/(N+1)^5/5 +・・・}
!
!

OPTION ARITHMETIC DECIMAL_HIGH ! 10進 1000桁
OPTION BASE 0

! =========初期設定 テスト用初期値 100桁==========
!DO
! INPUT PROMPT "いくらの桁で計算しますか?":KTA_L

LET KTA_L=100 ! テスト用初期値 100桁
print "桁数=";KTA_L;"桁"
! LOOP UNTIL MOD(KTA_L,20)=0 AND KTA_L>=100
LET HYRETU=ROUND(KTA_L*1.05/10,0) ! 5%のマージンをつけおく
! ====================================

! 10桁区切り
PRINT "HYRETU=";HYRETU

DIM N(HYRETU),N_1(HYRETU),INV_NP1ANS(HYRETU),KAKE_ANS(HYRETU)
DIM NM1_NP1(HYRETU),NM1_NP1_2(HYRETU)
DIM LG_N(HYRETU),TLR_K(HYRETU)

! =========初期設定 テスト用初期値 LOG(5)==========
LET N(0)=5 !
FOR I=1 TO HYRETU
LET N(I)=0
NEXT I
! ====================================


! log(N)= 2{ (N-1)/(N+1) + (N-1)/(N+1)^3/3 + (N-1)/(N+1)^5/5 +・・・}

  !続き1 会社員 2007/04/30 10:55:44  ツリーへ

Re: 多倍長数のLOGの計算 返事を書く ノートメニュー
会社員 <qiekrrepwd> 2007/04/30 10:55:44
! 続き1

LET N_1(0)=N(0)-1 !(N-1)

CALL INV_N(N,UBOUND(N),INV_NP1ANS) !1/(N+1) INV_NP1()が帰ってくる

FOR I=0 TO HYRETU
PRINT "N=";N(I)
NEXT I

FOR I=0 TO HYRETU
PRINT "N-1=";N_1(I)
NEXT I

FOR I=0 TO HYRETU
PRINT "1/(N+1)=";INV_NP1ANS(I)
NEXT I

CALL KAKEZAN(N_1,INV_NP1ANS,UBOUND(N_1),KAKE_ANS) ! (N-1)/(N+1)を計算 KAKE_ANS()が帰ってくる

FOR I=0 TO HYRETU
PRINT "(N-1)/(N+1)=";KAKE_ANS(I)
LET NM1_NP1(I)=KAKE_ANS(I)
NEXT I

CALL KAKEZAN(NM1_NP1,NM1_NP1,UBOUND(NM1_NP1),KAKE_ANS) ! (N-1)^2/(N+1)^2 答えが、KAKE_ANS()で帰ってくる

FOR I=0 TO HYRETU
LET NM1_NP1_2(I)=KAKE_ANS(I)
NEXT I

PRINT "(N-1)/(N+1)の結果"
FOR I=0 TO HYRETU
PRINT "NM1_NP1(";I;")=";NM1_NP1(I)
NEXT I

PRINT "(N-1)^2/(N+1)^2の結果"
FOR I=0 TO HYRETU
PRINT "NM1_NP1_2(";I;")=";NM1_NP1_2(I)
NEXT I



! log(N)= 2{ (N-1)/(N+1) + (N-1)/(N+1)^3/3 + (N-1)/(N+1)^5/5 +・・・}

FOR S=1 TO 100000000 STEP 2

IF S=1 THEN
FOR I=0 TO HYRETU
LET TLR_K(I)=NM1_NP1(I) ! (N-1)/(N+1)を設定
NEXT I
END IF

! テーラー項の計算 テーラー項の計算 テーラー項の計算 テーラー項の計算 テーラー項の計算
! log(N)= 2{ (N-1)/(N+1) + (N-1)/(N+1)^3/3 + (N-1)/(N+1)^5/5 +・・・}

IF S=>3 THEN
CALL KAKEZAN(TLR_K,NM1_NP1_2,UBOUND(TLR_K),KAKE_ANS) ! (N-1)/(N+1)^3/3 答えが、KKZ_ANS()で帰ってくる

FOR I=0 TO HYRETU
LET TLR_K(I)=KAKE_ANS(I)
NEXT I

FOR I=0 TO HYRETU
LET TLR_K(I)=TLR_K(I)*(S-2) ! S-2 倍する
NEXT I
CALL KTA_L_SYORI(TLR_K,UBOUND(TLR_K)) !桁処理
END IF

FOR I=0 TO HYRETU
IF I=<HYRETU-1 THEN
LET TLR_K(I)=INT(TLR_K(I)/S) ! Sで割る
LET TLR_K(I+1)=MOD(TLR_K(I),S)*10^10+TLR_K(I+1) ! 余りを次の桁へ渡す
END IF
IF I=HYRETU THEN
LET TLR_K(I)=INT(TLR_K(I)/S) ! Sで割る
END IF
NEXT I

CALL KTA_L_SYORI(TLR_K,UBOUND(TLR_K)) !桁処理

PRINT "================================"
PRINT "S=";S

FOR I=0 TO HYRETU
PRINT "TLR_K(";I;")=";TLR_K(I)
NEXT I

FOR I=0 TO HYRETU
LET LG_N(I)=LG_N(I)+TLR_K(I)
NEXT I


CALL KTA_L_SYORI(LG_N,UBOUND(LG_N)) !桁処理

! PRINT "桁処理後"
! FOR I=0 TO HYRETU
! PRINT "LG_N(";I;")=";LG_N(I)
! NEXT I


IF TLR_K(HYRETU/1.05+1)=<10^9 AND TLR_K(HYRETU/1.05)=0 THEN
PRINT "TLR_K(HYRETU/1.05+1)<10^9になりました"
EXIT FOR
END IF

NEXT S

FOR I=0 TO HYRETU
LET LG_N(I)=2*LG_N(I)
NEXT I
CALL KTA_L_SYORI(LG_N,UBOUND(LG_N)) !桁処理

! log(N)= 2{ (N-1)/(N+1) + (N-1)/(N+1)^3/3 + (N-1)/(N+1)^5/5 +・・・}

PRINT "---計算終了!--- LOGの結果"
FOR I=0 TO HYRETU
PRINT "LG_N(";I;")=";LG_N(I)
NEXT I

  !続き2 会社員 2007/04/30 10:58:37  ツリーへ

Re: 多倍長数のLOGの計算 返事を書く ノートメニュー
会社員 <qiekrrepwd> 2007/04/30 10:58:37
!続き2
!●●●●1/(N+1)のルーチン●●●●1/(N+1)のルーチン●●●●1/(N+1)のルーチン●●●●●
SUB INV_N(A(),LLLL,INV_NP1()) !1/(N+1)の作成
DIM Xn1(LLLL),Xn0(LLLL),KKZ_ANS(LLLL),Xn0_2(LLLL),NP1(LLLL)


! 1/(N+1)の作成
FOR I=0 TO LLLL
IF I=0 THEN LET NP1(0)=A(0)+1
IF I<>0 THEN LET NP1(I)=A(I)
NEXT I

CALL KTA_L_SYORI(NP1,UBOUND(NP1))

FOR I=0 TO LLLL
PRINT "NP1(I)=";NP1(I)
NEXT I



print "逆数スタート";time$

! Xn+1 = 2 * Xn - A * Xn^2
LET Xn0(0)=INT(1/NP1(0)) ! 初期化
LET Xn0(1)=INT(1/NP1(0)*10^10)-INT(1/NP1(0))*10^10 ! 初期化

FOR I=2 TO LLLL ! ニュートン法 パラメータ初期化
LET Xn0(I)=0
LET Xn1(I)=0
NEXT I

LET CNT=0
LET KTA_L_T=KTA_L
DO
LET KTA_L_T=KTA_L_T/10
LET CNT=CNT+1
LOOP UNTIL KTA_L_T<1
LET LOOOP=CNT/0.3010+1
PRINT "ループ回数=";LOOOP;"回"

FOR JJJJ=1 TO LOOOP
PRINT "■■■■JJJJ=";JJJJ

FOR I=0 TO HYRETU
LET Xn1(I)=0
NEXT I

PRINT "Xn^2の計算開始!!-----------------------------------------"
CALL KAKEZAN(Xn0,Xn0,UBOUND(Xn0),KKZ_ANS) !乗算サブルーチン Xn^2


FOR I=0 TO HYRETU !
LET Xn0_2(I)=KKZ_ANS(I)
NEXT I

PRINT "A * Xn^2の計算開始!!-----------------------------------------"
CALL KAKEZAN(NP1,Xn0_2,UBOUND(A),KKZ_ANS) !乗算サブルーチン A * Xn^2


PRINT "Xn1(I)=2*Xn0(I)-KKZ_ANS(I) 計算開始!!"
FOR I=0 TO HYRETU !
LET Xn1(I)=2*Xn0(I)-KKZ_ANS(I)
NEXT I

CALL KTA_L_SYORI(Xn1,UBOUND(Xn1))

PRINT "Xn1(I)=2*Xn0(I)-KKZ_ANS(I) 計算終了"

FOR I=0 TO LLLL !
LET Xn0(I)=Xn1(I)
NEXT I

PRINT "================================================================="
PRINT "================================================================="

FOR I=0 TO LLLL !
PRINT "■Xn1(";I;")=";Xn1(I)
NEXT I
NEXT JJJJ

  !続き3 会社員 2007/04/30 10:59:42  ツリーへ

Re: 多倍長数のLOGの計算 返事を書く ノートメニュー
会社員 <qiekrrepwd> 2007/04/30 10:59:42
!続き3


FOR I=0 TO LLLL
IF I=0 THEN LET INV_NP1(0)=Xn1(I)
IF I<>0 THEN LET INV_NP1(I)=Xn1(I)
NEXT I

END SUB
!●●●●1/(N+1)のルーチン●●●●1/(N+1)のルーチン●●●●1/(N+1)のルーチン●●●●●


! 掛算 サブルーチン 始まり■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
SUB KAKEZAN(JUX(),JUY(),LLL,KKZ_ANS()) ! Z=X*Y

FOR I=0 TO LLL
LET KKZ_ANS(I)=0
NEXT I

! X * Yの計算
FOR I=0 TO LLL
FOR J=0 TO LLL-I
LET KKZ_ANS(I+J)=JUX(I)*JUY(J)+KKZ_ANS(I+J)
NEXT J
NEXT I

CALL KTA_L_SYORI(KKZ_ANS,LLL)

END SUB



SUB KTA_L_SYORI(BBB(),LLL) !桁処理

DO ! 桁処理1 --負記号の削除
LET MNSF=0
IF BBB(1)<0 THEN
LET BBB(0)=BBB(0)+INT(BBB(1)/10^10)-1
LET BBB(1)=BBB(1)-10^10*INT(BBB(1)/10^10)+10^10
END IF
FOR I=1 TO LLL
IF BBB(I)<0 THEN
LET MNSF=1
LET BBB(I-1)=BBB(I-1)+INT(BBB(I)/10^10)-1
LET BBB(I)=BBB(I)-10^10*INT(BBB(I)/10^10)+10^10
END IF
NEXT I
LOOP UNTIL MNSF=0

DO ! 桁処理2 --桁上げ処理
LET OBF=0
FOR I=LLL TO 1 STEP -1
LET BBB(I-1)=BBB(I-1)+INT(BBB(I)/10^10)
LET BBB(I)=BBB(I)-10^10*INT(BBB(I)/10^10)
IF BBB(I)>10^10 THEN
LET OBF=1
END IF
NEXT I
LOOP UNTIL OBF=0
END SUB
! 掛算 サブルーチン 終わり■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

END

  一般論ですが,有理数モードで計算して誤差... 白石 和夫 2007/04/30 14:02:24  ツリーへ

Re: 多倍長数のLOGの計算 返事を書く ノートメニュー
白石 和夫 <fbdfvqwhki> 2007/04/30 14:02:24
一般論ですが,有理数モードで計算して誤差があるようなら近似式の見直し,そうでないなら,異符号数の加算あるいは同符号数の減算などによる桁落ちの可能性が高いと思います。
有理数モードでの計算結果はPRINT USINGを利用して1000桁程度までは小数に直せます。
http://hp.vector.co.jp/authors/VA008683/Aprox.htm

  Re:多倍長のLOG 河川屋 2007/05/03 22:34:03  ツリーへ

Re: 多倍長数のLOGの計算 返事を書く ノートメニュー
河川屋 <evcdumfptp> 2007/05/03 22:34:03
Re:多倍長のLOG

>8桁あたりまで正しくでてきているのですが、
>それ以降が正しくでてこないようです。
>もし、バグの理由がわかれば教えてください。
う〜ん、目の前にあるのは自作の多倍長ルーチンのバグですが、
それがなくなったとしても、まだダメです。
というのは、LOG(1000)あたりでさえ、級数の収束が非常に遅くなってしまうという致命傷が生じているため。
あと、1000桁モードを使用していながら、
そのうち10桁しか使っていないというのは、大いなるムダでしょう。
(メモリーも、計算量も。)
1000桁モードなら、配列1つあたり400桁でもいけるでしょう。
ただし、これらは、1000桁以上の答がほしい場合であり、
1000桁弱の答でいいなら、配列を使わないで生で計算してしまえばいいです。
たぶん、以下で正しい範囲は995〜997桁くらいだと思います。

! 1000桁モードLOG計算
OPTION ARITHMETIC DECIMAL_HIGH

LET X=5 !LOG(X)を求める
LET KETA=1000 !求めたい桁数
LET EPS=1/10^KETA/10 !収束判定値
CALL EE(E) !自然対数の底

! 級数の収束を加速するためLOG(X)整数部の概略値を計算
LET GETA=0
DO WHILE X>1.65 !1.65はSQRT(E)の近似値。
LET GETA=GETA+1
LET X=X/E
LOOP
DO WHILE X<0.6 !0.6は1/SQRT(E)の近似値
LET GETA=GETA-1
LET X=X*E
LOOP

! LOG(N)= 2{ (N-1)/(N+1) + (N-1)/(N+1)^3/3 + (N-1)/(N+1)^5/5 +・・・}
LET XX=(X-1)/(X+1)
LET XX2=XX
LET LG=0
LET LG0=XX2
LET I=1
DO WHILE ABS(LG0)>EPS ! このループを回る回数は、1000桁計算時最悪で800回強。
LET LG=LG+LG0
LET XX2=XX2*XX*XX
LET I=I+2
LET LG0=XX2/I
LOOP
LET LG=GETA+2*LG
PRINT LG
STOP

SUB EE(E) !自然対数の底の1000桁計算
DIM F(450)
! E=1+1/1!+1/2!+1/3!+.....を、桁落ち対策のため尻から足す
LET E=0
LET F(1)=1
FOR I=2 TO 450
LET F(I)=F(I-1)*I
NEXT I
FOR I=450 TO 1 STEP -1
LET E=E+1/F(I)
NEXT I
LET E=E+1
END SUB
END

  バグの箇所がわかりました。 会社員 2007/05/04 23:34:48  ツリーへ

Re: 多倍長数のLOGの計算 返事を書く ノートメニュー
会社員 <qiekrrepwd> 2007/05/04 23:34:48
バグの箇所がわかりました。
テーラー項を求める際の整数で割る手順に
誤りが見つかりました。

  │├DELETED  会社員  2007/05/05 00:05:41  (削除) ツリーへ

Re: バグの箇所がわかりました。 返事を書く
会社員 <qiekrrepwd> 2007/05/05 00:05:41 ** この記事は削除されました

  │├DELETED  会社員  2007/05/05 00:09:15  (削除) ツリーへ

Re: バグの箇所がわかりました。 返事を書く
会社員 <qiekrrepwd> 2007/05/05 00:09:15 ** この記事は削除されました

  │├DELETED  会社員  2007/05/05 15:33:09  (削除) ツリーへ

Re: バグの箇所がわかりました。 返事を書く
会社員 <qiekrrepwd> 2007/05/05 15:33:09 ** この記事は削除されました

  │├DELETED  会社員  2007/05/05 15:34:14  (削除) ツリーへ

Re: バグの箇所がわかりました。 返事を書く
会社員 <qiekrrepwd> 2007/05/05 15:34:14 ** この記事は削除されました

  │└小数点以下の場合に誤動作していたところを... 会社員 2007/05/16 23:03:53  ツリーへ

Re: バグの箇所がわかりました。 返事を書く ノートメニュー
会社員 <qiekrrepwd> 2007/05/16 23:03:53
小数点以下の場合に誤動作していたところを修正です

!多倍長のLOG計算 10桁区切り
!log(N)= 2{ (N-1)/(N+1) + (N-1)/(N+1)^3/3 + (N-1)/(N+1)^5/5 +・・・}

OPTION ARITHMETIC DECIMAL_HIGH ! 10進 1000桁
OPTION BASE 0

! =========初期設定============
DO
INPUT PROMPT "いくらの桁まで計算しますか?":KTA
print "桁数=";KTA;"桁"
LOOP UNTIL MOD(KTA,20)=0 AND KTA>=100
LET HYRE2=ROUND(KTA*1.15/10,0) ! 15%のマージンをつけおく
! 10桁区切り
PRINT "HYRE2=";HYRE2

DIM N(HYRE2)

! テスト用の初期値設定
PRINT "試験用 LOG(5)の計算"
LET N(0)=5! テスト用初期値LOG(5)
FOR I=1 TO HYRE2
LET N(I)=0
NEXT I
! =========初期設定============

DIM N_1(HYRE2),INV_NP1ANS(HYRE2),KAKE_ANS(HYRE2)
DIM NM1_NP1(HYRE2),NM1_NP1_2(HYRE2)
DIM LG_N(HYRE2),TYL_K(HYRE2)

! log(N)= 2{ (N-1)/(N+1) + (N-1)/(N+1)^3/3 + (N-1)/(N+1)^5/5 +・・・}
PRINT "計算開始 ";DATE$;" ";TIME$
CALL TYLR_PRE ! 事前準備

FOR S=1 TO 100000000 STEP 2
IF S=1 THEN
FOR I=0 TO HYRE2
LET TYL_K(I)=NM1_NP1(I) ! 初項に (N-1)/(N+1)を設定
NEXT I
END IF

IF S=>3 THEN
CALL KAKEZAN(TYL_K,NM1_NP1_2,UBOUND(TYL_K),KAKE_ANS) ! (N-1)/(N+1)^3/3 答えが、KKZ_ANS()で帰ってくる
FOR I=0 TO HYRE2
LET TYL_K(I)=KAKE_ANS(I)*(S-2) ! (N-1)/(N+1)^2*(S-2) 倍する
NEXT I
CALL KTA_SYORI(TYL_K,UBOUND(TYL_K)) !桁処理
END IF

FOR I=0 TO HYRE2
IF I=<HYRE2-1 THEN
LET AMARI=MOD(TYL_K(I),S)
LET TYL_K(I)=INT(TYL_K(I)/S) ! Sで割る
LET TYL_K(I+1)=AMARI*10^10+TYL_K(I+1) ! 余りを次の桁へ渡す
END IF

IF I=HYRE2 THEN
LET TYL_K(I)=INT(TYL_K(I)/S) ! Sで割る
END IF
NEXT I
CALL KTA_SYORI(TYL_K,UBOUND(TYL_K)) !桁処理

FOR I=0 TO HYRE2
LET LG_N(I)=LG_N(I)+TYL_K(I)
NEXT I

CALL KTA_SYORI(LG_N,UBOUND(LG_N)) !桁処理

IF TYL_K(HYRE2)=<10^9 AND TYL_K(HYRE2-1)=0 THEN
PRINT "終了! ";DATE$;" ";TIME$
EXIT FOR
END IF

NEXT S

  │ ├!続き 会社員 2007/05/16 23:04:58  ツリーへ

Re: 小数点以下の場合に誤動作していたところを... 返事を書く ノートメニュー
会社員 <qiekrrepwd> 2007/05/16 23:04:58
!続き
FOR I=0 TO HYRE2
LET LG_N(I)=2*LG_N(I)
NEXT I
CALL KTA_SYORI(LG_N,UBOUND(LG_N)) !桁処理

PRINT ""
FOR I=0 TO HYRE2
IF I=0 THEN
PRINT STR$(LG_N(I));"."
END IF
IF I>0 THEN
PRINT REPEAT$("0",10-LEN(STR$(LG_N(I)))) ;STR$(LG_N(I));" ";
END IF

IF I>0 AND I/5=INT(I/5) THEN PRINT ":";STR$(I*10)
NEXT I

!==========サブルーチン============= 事前準備
SUB TYLR_PRE

FOR I=0 TO HYR2
IF I=0 THEN LET N_1(0)=N(I)-1 !(N-1)
IF i>0 THEN LET N_1(I)=N(I)
NEXT I


CALL INV_N(N,UBOUND(N),INV_NP1ANS) !1/(N+1)INV_NP1()が帰ってくる
CALL KAKEZAN(N_1,INV_NP1ANS,UBOUND(N_1),KAKE_ANS) ! (N-1)/(N+1)を計算 KAKE_ANS()が帰ってくる

FOR I=0 TO HYRE2
LET NM1_NP1(I)=KAKE_ANS(I)
NEXT I

CALL KAKEZAN(NM1_NP1,NM1_NP1,UBOUND(NM1_NP1),KAKE_ANS) ! (N-1)/(N+1)^2を計算 KAKE_ANS()が帰ってくる

FOR I=0 TO HYRE2
LET NM1_NP1_2(I)=KAKE_ANS(I)
NEXT I


end SUB



!●●●●1/(N+1)のルーチン●●●●
SUB INV_N(A(),LLLL,INV_NP1()) !1/(N+1)の作成
DIM Xn1(LLLL),Xn0(LLLL),KKZ_ANS(LLLL),Xn0_2(LLLL),NP1(LLLL)

! 1/(N+1)の作成
FOR I=0 TO LLLL
IF I=0 THEN LET NP1(0)=A(0)+1
IF I<>0 THEN LET NP1(I)=A(I)
NEXT I
CALL KTA_SYORI(NP1,UBOUND(NP1))

! Xn+1 = 2 * Xn - A * Xn^2
LET Xn0(0)=INT(1/NP1(0)) ! 初期化
LET Xn0(1)=INT(1/NP1(0)*10^10)-INT(1/NP1(0))*10^10 ! 初期化

FOR I=2 TO LLLL ! ニュートン法 パラメータ初期化
LET Xn0(I)=0
LET Xn1(I)=0
NEXT I

LET CNT=0
LET KTA_T=KTA
DO
LET KTA_T=KTA_T/10
LET CNT=CNT+1
LOOP UNTIL KTA_T<1
LET LOOOP=CNT/0.3010+2
PRINT "ループ回数=";ROUND(LOOOP,2);"回"

FOR JJJJ=1 TO LOOOP
FOR I=0 TO HYRE2
LET Xn1(I)=0
NEXT I
CALL KAKEZAN(Xn0,Xn0,UBOUND(Xn0),KKZ_ANS) !乗算サブルーチン Xn^2

FOR I=0 TO HYRE2
LET Xn0_2(I)=KKZ_ANS(I)
NEXT I


  │ └!続き2 会社員 2007/05/16 23:05:47  ツリーへ

Re: 小数点以下の場合に誤動作していたところを... 返事を書く ノートメニュー
会社員 <qiekrrepwd> 2007/05/16 23:05:47
!続き2
! A * Xn^2の計算開始!
CALL KAKEZAN(NP1,Xn0_2,UBOUND(A),KKZ_ANS) !乗算サブルーチン A * Xn^2

! Xn1(I)=2*Xn0(I)-KKZ_ANS(I) 計算開始!
FOR I=0 TO HYRE2 !
LET Xn1(I)=2*Xn0(I)-KKZ_ANS(I)
NEXT I
CALL KTA_SYORI(Xn1,UBOUND(Xn1))

FOR I=0 TO LLLL !
LET Xn0(I)=Xn1(I)
NEXT I
NEXT JJJJ

FOR I=0 TO LLLL
IF I=0 THEN LET INV_NP1(0)=Xn1(I)
IF I<>0 THEN LET INV_NP1(I)=Xn1(I)
NEXT I
END SUB


! 掛算 サブルーチン 始まり■■■■
SUB KAKEZAN(JUX(),JUY(),LLL,KKZ_ANS())
FOR I=0 TO LLL
LET KKZ_ANS(I)=0
NEXT I
! X * Yの計算
FOR I=0 TO LLL
FOR J=0 TO LLL-I
LET KKZ_ANS(I+J)=JUX(I)*JUY(J)+KKZ_ANS(I+J)
NEXT J
NEXT I
CALL KTA_SYORI(KKZ_ANS,LLL)

END SUB

SUB KTA_SYORI(BBB(),LLL) !桁処理
DO ! 桁処理1 --負記号の削除
LET MNSF=0
IF BBB(1)<0 THEN
LET BBB(0)=BBB(0)+INT(BBB(1)/10^10)-1
LET BBB(1)=BBB(1)-10^10*INT(BBB(1)/10^10)+10^10
END IF
FOR I=1 TO LLL
IF BBB(I)<0 THEN
LET MNSF=1
LET BBB(I-1)=BBB(I-1)+INT(BBB(I)/10^10)-1
LET BBB(I)=BBB(I)-10^10*INT(BBB(I)/10^10)+10^10
END IF
NEXT I
LOOP UNTIL MNSF=0

DO ! 桁処理2 --桁上げ処理
LET OBF=0
FOR I=LLL TO 1 STEP -1
LET BBB(I-1)=BBB(I-1)+INT(BBB(I)/10^10)
LET BBB(I)=BBB(I)-10^10*INT(BBB(I)/10^10)
IF BBB(I)>10^10 THEN
LET OBF=1
END IF
NEXT I
LOOP UNTIL OBF=0
END SUB

END

  LOG(π)の結果です。 会社員 2007/05/16 23:10:37  ツリーへ

Re: 多倍長数のLOGの計算 返事を書く ノートメニュー
会社員 <qiekrrepwd> 2007/05/16 23:10:37
LOG(π) の結果です。

1.
1447298858 4940017414 3427351353 0587116472 9481291531 :50
1571513623 0714721377 6988482607 9783623270 2754897077 :100
0200981222 8697989159 0482055279 2345658727 9081078810 :150
2868252763 9391426634 5902902484 7733588699 3778920311 :200
9630824756 7940119160 2821722737 9888126563 1780498236 :250
9731331069 5003600064 4054872638 8022327009 6433504959 :300
5118150662 3725246834 3391269896 5797514047 7703857799 :350
5399825842 5660228485 0148136217 9159252505 6707638686 :400
0280763456 8897505123 3436078143 9914144264 2959671289 :450
7781136526 4523450410 5900716081 8570824981 1881831868 :500
9767284592 8110257656 8751724223 3833718927 3043288217 :550
3486510427 6153237516 1028392221 3401436967 1758561644 :600
2473718780 5060466920 5628337731 0133621627 4515898752 :650
0151299654 5465739691 5282523916 9585245379 3594601400 :700
3799565196 6603653800 0112659858 5001297656 9906074466 :750
7455472671 0450849506 6855874339 0774251341 5924126523 :800
1777178491 7799588095 7678805102 9644475090 1508911403 :850
2780807683 3733793894 9488075152 8900918753 6376608670 :900
7435833345 1081392325 3557406768 4327431198 0496339997 :950
6180304622 1286361595 8598364047 5800986179 9938264629 :1000


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