コンピュータは平方根をどのように計算しますか? つまり、そこで何が起こっているのです!どのように処理しますか !! ニュートン法などの数学的な方法を使用していますか? 三角関数はどうですか?そして、ほとんどすべての数学関数。すべての言語に独自の方法がある場合は、c++ について話しましょう。
4 に答える
最新の非組み込みCPU(x86やより大きなARMコアなど)には、平方根を直接計算するためのハードウェア命令があります。これらの命令をサポートするハードウェアの実装はさまざまですが、通常は教科書の1桁ごとのアルゴリズムのバリエーションです(ただし、常に2進数であるとは限りません。4進数または16進数も使用できます)。これらは通常、CPUで最も遅い基本的な算術演算の1つです。16〜64サイクルのようなタイミングは珍しくなく、これらの命令はパイプライン化されないことがよくあります。
直接ハードウェア平方根命令(Itanium、PPCなど)がないCPUでは、一般的なアプローチは、初期推定値を生成し(推定値を生成する命令、またはルックアップテーブルのいずれかを使用)、反復法を使用してその推定値を調整することです。メソッド(通常はニュートンまたはゴールドシュミット)。興味があれば、この主題に関するPeterMarksteinまたはRogerGolliverの著作のいくつかを追跡することができます。
より複雑な数学関数(三角関数など)は、通常、引数をいくつかの基本領域に縮小し、それを多項式または有理関数で近似することによって計算されます。詳細については、オンラインで入手できるいくつかの数学ライブラリのソースを確認できます(fdlibmが出発点として適しています)。
x86命令セットは、exp、log、sinなどの数学関数をサポートする多数の命令を提供しますが、優れたソフトウェアライブラリの実装によりパフォーマンスが向上するため、これらは現在では一般的に使用されていません。
言及されていない別の可能性は、CORDIC メソッドです。CORDIC はソフトウェアでは広く使用されていませんが、ハードウェアではかなり一般的であり、多くのゲートを使用しなくても適切なパフォーマンスを得ることができます。
平方根の計算にはニュートンの反復収束法が使われていると思います
他の人が指摘しているように、これは非常に幅広い質問です。ソフトウェアでうまく機能するものは、ハードウェアの実装には不適切な選択かもしれません。次に、IEEE-754、ハードウェアルックアップテーブルなどの正しい丸めの問題がありますlibm
。実装を含む多くのオープンソースCライブラリがあります。古典的な方法と現代的な方法の概要については、こちらをご覧ください。