| 
    
     |  | こんばんは、皆さん。 >早速やってみましたが、これとはちょっと違うような・・・・・
 >無限にでも計算出来る様な計算式(マクロ)が・・・・・・・・・
 中学だったかな?高校1年生だったかな?
 平方根の筆算(私のころは、縦書きの計算と呼んでいました)
 を習ったことがありました。
 
 意味もわからず、機械的に方法だけはマスターした記憶があります。
 ありますが、これ使わないんですよね!!(試験にもでなかったし・・)
 で調べると、
 
 http://homepage1.nifty.com/moritake/sansu/6/heihoukon/PAGE001.HTM
 
 バビロニアにおける平方根の求め方というらしいです。
 
 '==================================
 Sub main()
 For idx = 1 To 10
 Cells(idx, 1).Value = "'" & sqr_calc(idx, 100)
 Next
 End Sub
 '=======================================================================
 Function sqr_calc(myvalue As Variant, Optional lpmax As Long = 10) As string
 'Input---myvalue---平方根
 '    lpmax-----計算回数
 'out-----sqr_calc---myvalueの平方根
 Dim wk As Double
 Dim wk2 As Double
 Dim ans As String
 Dim vidx As Long
 Dim jdx As Long
 Dim nextketa As Long
 Dim lpcnt As Long
 Dim period As Boolean
 period = False
 wk = Int(CStr(myvalue))
 Do Until wk < 100
 wk = wk \ 100
 Loop
 vidx = Len(CStr(wk)) + 1
 ans = ""
 wk2 = 0
 retcode = 0
 lpcnt = 0
 Do While retcode = 0 And lpcnt < lpmax
 For jdx = 9 To 0 Step -1
 If (wk2 * 10 + jdx) * jdx <= wk Then
 wk = wk - (wk2 * 10 + jdx) * jdx
 
 wk2 = CDbl(wk2) * 10 + jdx * 2
 ans = ans & jdx
 Exit For
 End If
 Next jdx
 GoSub get_next_data
 lpcnt = lpcnt + 1
 Loop
 sqr_calc = IIf(InStr(ans, ".") = Len(ans), Left(ans, Len(ans) - 1), ans)
 Exit Function
 get_next_data: '次の二桁を読み込む Input---wk, out---wk,ans(小数点をつけるときのみ)
 nextketa = 0
 Do While vidx <= Len(CStr(myvalue)) And nextketa < 2
 If Mid(CStr(myvalue), vidx, 1) = "." Then
 ans = ans & "."
 period = True
 Else
 wk = wk * 10 + CDbl(Mid(CStr(myvalue), vidx, 1))
 nextketa = nextketa + 1
 End If
 vidx = vidx + 1
 Loop
 If nextketa < 2 Then
 If period = False Then
 ans = ans & "."
 period = True
 End If
 wk = wk * 10 ^ (2 - nextketa)
 End If
 If nextketa = 0 And CDbl(wk) = 0# Then
 retcode = 1
 Else
 retcode = 0
 End If
 Return
 End Function
 
 もっとも計算回数が大きいと誤差も大きいと思いますけど・・・。
 確認してみてください。
 
 |  |