[ポール・カーティス]はSEGGERの上分裂を計算に関するブログ記事の興味深いシリーズを持っています。これは熱いトピックでしたが、最近は多くのコンピュータやコンピュータ言語は内蔵の乗算と除算をサポートしています。しかし、一部のプロセッサは、命令と、それは理想的とは言えないかもしれない行うためのライブラリを欠いています。あなたはスピードやスペースを最適化することを可能にするかもしれないあなた自身をロールバックする方法を知っています。除算を行うには、ニュートンのアルゴリズムを使用して、現在の割賦カバー。
スティーブ・マーティンは、億万長者になると税金を払うことはありません方法についての有名なビットを持っていました。彼はまず…数百万ドルを取得します」、と言って始まりました。あなたが最初にあなたが分割することができます前に掛け合わせる方法を知っている必要があり以来続いて…」このメソッドは、少しそのようなものです。基本的な前提は2つあり:ニュートン法を使用すると、連続した乗算による逆数の推定値を洗練して、逆数は分割と同じ数を乗じてみましょう。私たちは6で34を分割する必要がある場合はつまり、あなたは* 1/6 34に6分の34を書き換えることができ、答えは同じです。
逆数のためのニュートンの近似は、あなたが答えを推測を取り、その後、一連の乗算を通してそれを絞り込むことができます。各乗算は、より良い精度を作成します。あなたは、古典的なスピード/スペースのトレードオフを実行するためにこれを使用することができます。たとえば、ちょうど私達がバイト(おそらく固定小数点バイト)の逆数を見つけたいとしましょう。 256個の要素のルックアップテーブルは、完璧な精度を提供することになると非常に高速になります。これ以上の数学は必要ありません。しかし、何についての32ビット?今の表では、あまりにも大きいです。しかし、あなたは、ルックアップする32ビットの番号の最初の8ビット、言うことができます。以上。以下。あなたにとって重要なものに依存します。
だから今、あなたはあなたの逆数の貧弱な推定値を持っています。サー・アイザックはそれを改善することができます。いくつかの数aについて、あなたは一緒にあなたの見積もり(x)と乗算それらを取ります。 2からその数を引くと、新しい見積もりを取得することにより、古い推定値を乗算する係数を有します。先にスキップ、あなたの推定が正しかった場合、乗算はあなたにすべての古い推定値を変更しないだろう1を与えるだろう明らかです。見積もりがオフになっている場合は、倍率を取得します。
式として、それは次のようになります。
X = X *(2 * X)。
あなたは22の逆数は0.02であるかもしれないを決めるのであれば、最初のパスはあなたを与えるだろう。
0.02 *(2-22 * 0.02)= 0.0312
0.0312 *(2-22 * 0.0312)= 0.0410
0.0410 *(2-22 * 0.0410)= 0.0450
正しい答えは、循環小数0.0454545であり、あなたが続けるならば、あなたはそこに取得します。
もちろん、あなたは分裂を行うための1以上の時間を掛けなければなりません。
我々は、ポストは、固定小数点実装を有しており、次にARM、RISC-V、およびdsPIC30ため、得られたアセンブリコードを検査することを好みました。まあ価値読みます。
我々は、アセンブリ言語で使用できる数学のトリックが大好きです。あなたはAVRと浮動小数点で作業している場合、この方法をお見逃しなく。