4

私は今、平方根の整数部分と残りを返す平方根を計算するための特定のアルゴリズムを見ています。

たとえば、次のようになります。mysqrt(140) = 11*11 + 19 = integer 11, remainder 19

問題は、平方根を float として計算できるかどうかです。たとえば、140 の平方根は ~ 11.8321 です....?

コメントから編集

左/右シフト、加算、減算などのバイナリ演算のみを使用する固定小数点平方根の VHDL 実装を検討しています。

...アルゴリズムで十分です。

EDIT 2私は実際にこのアルゴリズムをここで読んでいます: http://pioneer.netserv.chula.ac.th/~achatcha/Publications/0012.pdf

ラジカンドを 2n だけ左にシフトすることで、より良い精度が得られるようです。なぜそれが機能しているのかよくわかりませんか?誰か説明してくれませんか

4

3 に答える 3

4
(11+x)^2 = 140
11^2 + 2*11*x + x^2 = 140
2*11*x + x^2 = 19
x^2 + 2*11*x - 19 = 0

それを解決するには、別の sqrt を実行する必要があります。

x = -11 + sqrt((2*11)^2 + 4 * 19) / 2

または最終的な答えについては:

11+x = sqrt((2*11)^2 + 4 * 19) / 2

これはただ行うよりも速くはありません

sqrt(140)

簡単な概算を探している場合:

x^2 + 2*11*x - 19 = 0
x = (19 - x^2)/(2*11)

x = 0.5 と推測すると、

x = 19/(2*11) - 0.5*0.5/(2*11) = 0.852272727

これを繰り返し適用してより良い近似値を得ることができますが、おそらくニュートン法の方が高速です。

于 2012-01-17T12:26:33.027 に答える
1

に応答して:

ラジカンドを 2n だけ左にシフトすることで、より良い精度が得られるようです。なぜそれが機能しているのかよくわかりませんか?誰か説明してくれませんか

あなたがリンクした論文は、2nの左シフトについて語っています。それが機能する理由は、平方根に簡単に因数分解できる 4 の倍数で効果的にシフトしているためです。

sqrt(K*2^2n) = sqrt(K)*sqrt(2^2n) = sqrt(K)*2^n

したがって、n ビットだけ後ろにシフトするだけで、正しい答えが得られます。これらのシフトされたビットを小数部として保持すると、小数の答えが得られます。

平方根の前に 100 を掛け、後で 10 で割るという 10 進数で考えてください。

そう

sqrt(2) = sqrt(200)/10 = 14/10 = 1.4

sqrt(200) は整数のみを指定します。

于 2012-01-17T13:53:10.860 に答える
0

あなたの質問を理解しているかどうかわかりません。float で sqrt 関数を使用する方法、または独自の関数を作成する方法を知りたいですか?

前者の場合、言語は何かを提供します (おそらく sqrt() と呼ばれます)。後者の場合は、何らかの数値リソースを調べる必要があります。GSL をお勧めします: http://www.gnu.org/software/gsl/

于 2012-01-17T12:18:28.287 に答える