3体問題

日常の数学・物理    ーー それでも地球はまわっている



e の計算


2.7182818284590452353602874713527・・・
多桁プログラム  エクセルVBA 10万桁まで    計算時間30分程度



  1. 7182818284 5904523536 0287471352 6624977572 4709369995 9574966967 6277240766 3035354759 4571382178 5251664274 100
    2746639193 2003059921 8174135966 2904357290 0334295260 5956307381 3232862794 3490763233 8298807531 9525101901 200
    1573834187 9307021540 8914993488 4167509244 7614606680 8226480016 8477411853 7423454424 3710753907 7744992069 300
    5517027618 3860626133 1384583000 7520449338 2656029760 6737113200 7093287091 2744374704 7230696977 2093101416 400
    9283681902 5515108657 4637721112 5238978442 5056953696 7707854499 6996794686 4454905987 9316368892 3009879312 500
    7736178215 4249992295 7635148220 8269895193 6680331825 2886939849 6465105820 9392398294 8879332036 2509443117 600
    3012381970 6841614039 7019837679 3206832823 7646480429 5311802328 7825098194 5581530175 6717361332 0698112509 700
    9618188159 3041690351 5988885193 4580727386 6738589422 8792284998 9208680582 5749279610 4841984443 6346324496 800
    8487560233 6248270419 7862320900 2160990235 3043699418 4914631409 3431738143 6405462531 5209618369 0888707016 900
    7683964243 7814059271 4563549061 3031072085 1038375051 0115747704 1718986106 8739696552 1267154688 9570350354 1000

Option Explicit
Sub e計算2()
' e計算     e=1+1+1/2!+1/3!+1/4!+1/5!+・・・ 10桁区切り
' n!≒√2πn(n/e)^n
Dim EEE(100004)
Dim 階乗逆数(100004)
Dim KK As Long, LL As Long
Dim ans As Variant, ans2 As Variant
Dim 項数 As Long
Call Clear_cell 'クリア

項数 = 27000
EEE(0) = 1 + 1
階乗逆数(0) = 1

For LL = 2 To 項数
    ans = 割算(階乗逆数, LL)
    For KK = 0 To 10003          '1万×10=10万桁まで
     階乗逆数(KK) = ans(KK)      '階乗の逆数を保管
    Next KK
   
    ans2 = 和_一次元(EEE, ans)   '各項を足す
    For KK = 0 To 10003
      EEE(KK) = ans2(KK)
    Next KK
Next LL

Call 印刷(EEE, 9)
End Sub

'★★★割算★★★
Function 割算(ByVal 被, ByVal div_X) As Variant
Dim 商(100004)
Dim 余(100004)
Dim KK As Long
Dim KTA As Long

KTA = 10 '10桁区切り

For KK = 0 To 10003
 商(KK) = 被(KK)
Next KK

For KK = 0 To 10003  ' そろばん
 商(KK) = Int(被(KK) / div_X)
 余(KK) = 被(KK) - Int(被(KK) / div_X) * div_X
 被(KK) = 0
 被(KK + 1) = 被(KK + 1) + 余(KK) * 10 ^ KTA
Next KK

割算 = 商
End Function

'★★★足算★★★
Function 和_一次元(MM, NN) As Variant
Dim KK As Long
Dim ans(100004)

For KK = 0 To 10003
  ans(KK) = MM(KK) + NN(KK)
Next KK

For KK = 10003 To 1 Step -1
  ans(KK - 1) = ans(KK - 1) + Int(ans(KK) / (10 ^ 10))      '余剰を上へ積む
  ans(KK) = ans(KK) - Int(ans(KK) / (10 ^ 10)) * (10 ^ 10)  '上の桁を消す
Next KK

和_一次元 = ans
End Function

'★★★印刷★★★
Sub 印刷(ByVal 商余, ByVal 列)
Dim KK As Long
Dim 行 As Long, 横 As Long

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)

For KK = 0 To 10003  ' 印刷印刷
 行 = Int((KK - 1) / 10) + 10
 横 = ((KK - 1) Mod 10) + 9
 ws.Cells(9, 9) = "2"   '修正

If KK = 0 Then
'  ws.Cells(9, 9) = "2"   '修正
Else
    If 商余(KK) < 10 ^ 7 Then
     ws.Cells(行, 横) = "000" + CStr(商余(KK))
    ElseIf 商余(KK) < 10 ^ 8 Then
     ws.Cells(行, 横) = "00" + CStr(商余(KK))
    ElseIf 商余(KK) < 10 ^ 9 Then
     ws.Cells(行, 横) = "0" + CStr(商余(KK))
    Else
     ws.Cells(行, 横) = CStr(商余(KK))
    End If
End If

If Int(KK / 10) = (KK / 10) Then
     ws.Cells(行, 横 + 1) = CStr(KK * 10)
End If
Next KK

End Sub

'★★★クリア★★★
Sub Clear_cell()
 Range("G9:S50000").ClearContents
End Sub