アセンブリで整数を最も近い整数に丸めるにはどうすればよいですか? ここでは分岐の使用は許可されていません。
たとえば、195 * .85 = 165.75 です。通常、195 にスケール ファクター (100) を掛けてから掛けてから、スケール ファクターを割ります。これで 165 になります。どうすれば 166 になりますか?
これがひどい質問でしたら申し訳ありません - 私は組み立てが初めてです! ありがとうございました。
アセンブリで整数を最も近い整数に丸めるにはどうすればよいですか? ここでは分岐の使用は許可されていません。
たとえば、195 * .85 = 165.75 です。通常、195 にスケール ファクター (100) を掛けてから掛けてから、スケール ファクターを割ります。これで 165 になります。どうすれば 166 になりますか?
これがひどい質問でしたら申し訳ありません - 私は組み立てが初めてです! ありがとうございました。
たとえば、195 * .85=165.75です。通常、私は195にスケール係数(100)を掛けてから乗算し、次にスケール係数を割ります。これは私に165を与えるでしょう。どうすれば166を得ることができますか?
古典的には、乗算と除算ではなく、2の倍率とシフトを使用します。除算と乗算のコストは、特定の精度を維持することに関心がある多くのアーキテクチャのシフトと同じだと思います。
とにかく、halexによってほとんど示唆されているように、分割する前に0.5を追加します。正味の効果は、小数部がすでに0.5以上の場合、整数部に持ち込まれることです。そうでなければ、キャリーはありません。
それで:
195 * 100 = 19500
19500 * 0.85 = 16575
16575 + 50(つまり、0.5)= 16625
16625/100 = 166
整数のみが与えられ、整数の 1 つをスケール ファクターを使用して 10 進数のように扱う必要があると言われたと仮定すると、必要なサイズの 2 倍のスケール ファクターを使用してこれを行うことができます。したがって、100 の代わりに 200 を使用します。これにより、切り上げるかどうかに応じて、結果の最後のビットが 1 または 0 になります。
したがって、Cスタイルでは次のようになります
result = (195 * 85) / (100 / 2);
add = result & 1;
result = result / 2 + add;
切り上げ (つまり、切り捨て) が想定されていない場合、「追加ビット」は 0 になります。それ以外の場合、切り上げが想定されている場合、「追加ビット」は 1 になります。
これで、これを適切にアセンブリに変換するために必要な疑似コードが得られるはずです。
x86 アセンブリには、FRNDINT 命令があります。
整数には小数点以下の桁がないため、すでに整数になっています。