タグ付けされた質問 「arithmetic-division」

6
ハードウェア除算が乗算よりもはるかに長くかかるのはなぜですか?
マイクロコントローラでの乗算よりもハードウェアの除算に時間がかかるのはなぜですか?たとえば、dsPICでは、除算には19サイクルかかりますが、乗算には1クロックサイクルしかかかりません。 私には、いくつかのチュートリアルを経て事業化アルゴリズムと乗算アルゴリズムウィキペディアに。これが私の推論です。 除算アルゴリズムは、ウィキペディアで復元する低速除法のように、再帰的なアルゴリズムです。これは、stepの(中間)結果がstep kへの入力として使用されるk+1ことを意味します。つまり、これらのアルゴリズムは並列化できません。したがって、n除算を完了するには少なくともサイクルが必要nですが、被除数のビット数は異なります。16ビットの配当の場合、これは少なくとも16サイクルに相当します。 乗算アルゴリズムは再帰的である必要はありません。つまり、並列化することが可能です。ただし、乗算アルゴリズムにはさまざまな種類があり、マイクロコントローラーで使用できるアルゴリズムはわかりません。ハードウェア/マイクロコントローラーで乗算はどのように機能しますか? Dadda乗算器アルゴリズムを見つけました。これは、完了までに1クロックサイクルしかかからないはずです。ただし、ここで得られないのは、ダダのアルゴリズムが3つのステップで進行するのに対し、ステップ1の結果はステップ2などで使用されるということです。これによると、完了するには少なくとも3クロックサイクルかかります。


10
AVRの効率的な逆(1 / x)
AVRで逆数を計算する(または近似する)効率的な方法を見つけようとしています。 速度を直線的に変化させることができるように、ステッピングモーターのパルス周期を計算しようとしています。周期は速度の逆数に比例します(p = K/v)が、これをオンザフライで計算する良い方法は考えられません。 私の式は p = 202/v + 298; // p in us; v varies from 1->100 Arduinoの上のテスト、除算は離脱完全に無視しているように見えるpに固定298(おそらくこれはAVR-GCCで異なるだろうが)。また、をv超えるまでループで合計し、ループ202をカウントしようとしましたが、これは非常に遅いです。 ルックアップテーブルを生成してフラッシュに保存することはできましたが、別の方法があるかどうか疑問に思っていました。 編集:たぶん、タイトルは「効率的な分割」でなければなりません... 更新:pingsweptが指摘しているように、速度を速度にマッピングするための私の式は間違っています。しかし、主な問題は除算操作です。 編集2:さらなる調査で、除算はarduinoで機能しています。問題は、上記の誤った式と他の場所でのintオーバーフローの両方が原因でした。

10
整数mod 10と整数除算10を取得する最も速い方法は?
ハードウェアが係数または除算演算をサポートしていない場合、ソフトウェアによる係数/除算をシミュレートするには、さらに多くのCPUサイクルが必要です。オペランドが10の場合、除算と係数を計算するより速い方法はありますか? 私のプロジェクトでは、整数モジュラス10を頻繁に計算する必要があります。特に、PIC16Fで作業していて、LCDに数値を表示する必要があります。サポートする4桁があるため、係数と除算関数(ソフトウェア実装)への4つの呼び出しがあります。つまり、次のようになります。 digit = number % 10; // call to an expensive function number /= 10; // call to an expensive function somehow_lit_segments(); digit = number % 10; // call to an expensive function number /= 10; // call to an expensive function somehow_lit_segments(); digit = number % 10; // …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.