web-dev-qa-db-ja.com

コンピューターはどのように平方根を計算しますか?

コンピューターはどのように平方根を計算しますか?何が起こっているのですか!それはどのように処理するのですか?ニュートン法のようないくつかの数学的な方法を使用していますか?三角関数はどうですか?そして、ほとんどすべてのそれらの数学関数。すべての言語に独自の方法がある場合は、C++について話しましょう。

26
Loers Antario

最新の非組み込み型CPU(x86以上のARMコアなど))には、平方根を直接計算するためのハードウェア命令があります。これらの命令をサポートするハードウェア実装はさまざまですが、通常は教科書桁ごとのアルゴリズム(常に2を基数とするわけではありません。4や16も使用できます。これらは通常、CPUで最も遅い基本的な算術演算の1つです。16〜64サイクルなどのタイミングは珍しくありません。命令はパイプライン化されないことがよくあります。

直接ハードウェア平方根命令(Itanium、PPC、その他)がないCPUでは、一般的なアプローチは、初期推定値を生成し(推定値を生成する命令またはルックアップテーブルを使用)、次に反復を使用してその推定値を調整しますメソッド(通常、NewtonまたはGoldschmidt)。興味があれば、ピーターマークシュタインやロジャーゴリバーの主題についての文章をいくつか調べてみてください。

より複雑な数学関数(トリガー操作など)は、通常、引数をいくつかの基本領域に減らし、それを多項式関数または有理関数で近似することによって計算されます。オンラインで入手できるいくつかの数学ライブラリのソースで詳細を確認できます(fdlibmが出発点として最適です)。

X86命令セットは、exp、log、sinなどの数学関数をサポートする多数の命令を提供しますが、優れたソフトウェアライブラリの実装によりパフォーマンスが向上するため、これらは一般的に使用されなくなりました。

29
Stephen Canon

これに関する良い記事 http://www.codeproject.com/Articles/69941/Best-Square-Root-Method-Algorithm-Function-Precisi 使用されているさまざまな方法の比較を示しています。

7
enriched

言及されていない別の可能性は、 CORDICメソッド です。 CORDICはソフトウェアで広く使用/知られていませんが、ハードウェアではかなり一般的であり、多くのゲートを使用せずにまともなパフォーマンスを得るのに非常に適しています。

5
Jerry Coffin

ニュートンの反復収束法は平方根の計算に使用されていると思います

2
user1598202

他の人が指摘したように、これは非常に広範な質問です。ソフトウェアに適切に機能するものは、ハードウェアの実装には不適切な選択かもしれません。そして、IEEE-754、ハードウェアルックアップテーブルなどの正しい丸めの問題があります。libm実装を含むオープンソースのCライブラリがたくさんあります。古典的方法と現代的方法の良い概要は、 here にあります。

2
Brett Hale