2017-09-29 10 views
2

アルゴリズムは次のとおりです。この平方根アルゴリズムの名前は何ですか?次のように

res <- 0 
for i from 15 downto 0 do: 
    change the ith bit of result to 1 
    if res^2 > x then: 
     change the ith bit of res back to 0 
return res 

私は完全にそれがどのように動作するかを理解し、私は、このメソッドが呼び出されたのか分かりません。私は平方根の計算方法のためにwikiを見てきましたが、無駄です。これは数字単位の方法ですか?

(関連:How to compute the integer square root of a number in x86-64, without using div?

+0

他の領域(特にアナログ/デジタル変換)では、この手順を「逐次比較」と呼びます。しかし、平方根では、ニュートンの方法は「逐次近似」とも呼ばれます。あなたはそれを区別するためにこのメソッドを "2進逐次近似"と呼ぶことができます。これは、ニュートンの方法がより高速に収束するため、平方根には使用されません。 –

+4

これは、基底2の実装にbitwise opsを使って、wikipediaが[digit by digit algorithm](https://en.wikipedia.org/wiki/Integer_square_root#Digit-by-digit_algorithm)を呼び出すのはかなり明確です。最近のx86ハードウェアでは、最も高速な整数sqrtはFPのdouble精度のハードウェアを使用することです。 Haswellでは、 'double'への/からの変換は、それぞれの方法で4サイクルの待ち時間と' sqrtsd'のための16サイクルの待ち時間です。 (そして、3命令/ 5命令しかないので、何か他のことがあれば、この待ち時間を容易に隠すことができます。) –

+2

CPUは乗算命令を持たない時代から古代の遺物のように見えます。 (resと2の2つの異なる値を使って、0x8000と0x40000000で初期化されます:1ビット右に1つのres-shiftet、もう1つのres²は各ループで2ビットずつ)、その後に 'res^2 'を簡単に避けることができます6502などのCPUで簡単に実装できること – Tommylee2k

答えて

3

ピーター・コルドはコメントで述べたように、これはdigit-by-digit algorithm(ここでは二進数)です。

これはバイナリ検索の一種です。二乗結果がxに近づいてもそれを超えていない場合はi番目のビットを設定しますので、2つの近似値を必要に応じて加算すると、より良い結果が得られます。

+3

これは実際に質問に答えているのか分かりませんが... "バイナリ検索のようなもの"は本当に名前ではありません。 –

+0

@David:しかし、「数字ごとのアルゴリズム」はIMOに答えています。 –

+0

私は同意します。それは元の答えではなかった。 –

関連する問題