現在、固定小数点表現で 2 つの数値を乗算する方法を理解しようとしています。
私の数値表現が次のようになっているとします。
[SIGN][2^0].[2^-1][2^-2]..[2^-14]
私の場合、番号10.01000000000000 = -0.25
.
たとえば、どのようにします0.25x0.25
か-0.25x0.25
?
あなたが助けてくれることを願っています!
現在、固定小数点表現で 2 つの数値を乗算する方法を理解しようとしています。
私の数値表現が次のようになっているとします。
[SIGN][2^0].[2^-1][2^-2]..[2^-14]
私の場合、番号10.01000000000000 = -0.25
.
たとえば、どのようにします0.25x0.25
か-0.25x0.25
?
あなたが助けてくれることを願っています!
より大きなサイズの変数に乗算してから、固定小数点精度のビット数だけ右シフトします。
C での簡単な例を次に示します。
int a = 0.25 * (1 << 16);
int b = -0.25 * (1 << 16);
int c = (a * b) >> 16;
printf("%.2f * %.2f = %.2f\n", a / 65536.0, b / 65536.0 , c / 65536.0);
基本的には、すべてを定数で乗算して、小数部を整数範囲に引き上げます。次に、2 つの係数を乗算し、(オプションで) 定数の 1 つで除算して、将来の計算で使用する標準範囲に積を戻します。これは、端数ドルで表された価格に 100 を掛けてからセントで計算するようなものです (つまり、1.95 ドル * 100 セント/ドル = 195 セント)。
乗算先の変数の範囲をオーバーフローしないように注意してください。上記の例の1 << 8
代わりに使用するように、オーバーフローを避けるために定数を小さくする必要がある場合があります。1 << 16