√2 の話:その26:整数平方根:3
★C言語による 最新 アルゴリズム事典 奥村晴彦 著、技術評論社、平成3年2月25日、初版第1刷発行
この本を眺めていましたら
「整数x(非負の)平方根の整数部分を求めるには・・・」
という記述がありまして、C言語特有の書き方がしてあるのですが、要するに、ニュートン法を整数で実行すればよい、ということのようでした。
そうなんだ、そういう考え方もあったのか、とVBAで早速試してみました。
*******************
Option Explicit '変数宣言を強制する、という宣言
Sub main()
Dim i As Long
For i = 0 To 40
Cells(i + 1, 1).Value = i
Cells(i + 1, 2).Value = isqrt(i)
Cells(i + 1, 3).Value = Int(Sqr(i))
Next i
End Sub
Function isqrt(n As Long) As Long
Dim s As Long, t As Long
If (n = 0) Then
isqrt = 0
Else
s = n
Do
t = s
s = (s + (n \ s)) \ 2
Loop While (s < t)
isqrt = t
End If
End Function
*******************
ここで「\」という記号がありますが、これは整数除算の演算子です。
例えば「10 \ 3」を実行すると。「3」が返ってきます。
「商」を返す演算子ですね。
実行結果は
0 0 0
1 1 1
2 1 1
3 1 1
4 2 2
5 2 2
6 2 2
7 2 2
8 2 2
9 3 3
10 3 3
11 3 3
12 3 3
13 3 3
14 3 3
15 3 3
16 4 4
17 4 4
18 4 4
19 4 4
20 4 4
21 4 4
22 4 4
23 4 4
24 4 4
25 5 5
26 5 5
27 5 5
28 5 5
29 5 5
30 5 5
31 5 5
32 5 5
33 5 5
34 5 5
35 5 5
36 6 6
37 6 6
38 6 6
39 6 6
40 6 6
----------------------------------------
ホントだ。
私の奇数列を足していく、というプログラムと全く同じ結果を得ました。
当たり前ですね。
しっかしまぁ、こんな関数に利用価値があるとはとても思えませんが、もし必要でしたら、私のアルゴリズムでも、奥村さんのアルゴリズムでも、お使いください。
移植性は抜群でしょ。あまりにも単純だからなぁ。
「理科おじさん」カテゴリの記事
- 化学の日(2022.10.26)
- 秒速→時速(2022.09.01)
- 風速75メートル(2022.08.31)
- 「ウクライナで生まれた科学者たち」(2022.05.31)
- 反射光(2022.05.09)
コメント