浮動小数点除算の仮数部の除算を実行するアルゴリズムがありますが、以下に掲載されているアルゴリズムの適切な名前がわかりません(復元、非復元、SRT など)。
入力が浮動小数点形式であるという事実に対処するために、オペランド指数を減算して新しい指数を見つけ、符号ビットを XOR して新しい符号ビットを取得し、丸めスキームのために最も近いものに丸めます。
しかし、仮数を分割するためにウィキペディアからこのアルゴリズムを使用しました:( https://en.wikipedia.org/wiki/Division_algorithm ):
これが私のコードです:
{Code for handling exponent, sign bit, and grabbing mantissa,
invalid input detection and zero input detection}
{op1 is the numerator, op2 is the divisor)
{assuming 32-bit floating point)
long long mant1, mant2;
mant1 = (1 << 23) & (op1 & 0x7FFFFF); // Make mantissas with hidden bit masked in
mant2 = (1 << 23) & (op2 & 0x7FFFFF);
long long Q = 0, N, D; // Declare quotient, numerator, and divisor
N = mant1 << 26;
D = mant2 << 26;
for (int i = 0; i < 28; i++) {
Q = Q << 1; // Multiply quotient by 2
if (N-D < 1) {
N = N-D; // Set new numerator equal to difference
Q = Q | 1; // Set LSB of quotient to 1
}
D = D >> 1; // Shift divider right by 1;
}
このアルゴリズムは、ウィキペディアによると剰余を伴う整数除算 (符号なし) と呼ばれるものに似て いますが、浮動小数点除算アルゴリズムの他のすべての文献では、そのようなアルゴリズムへの参照を見つけることができませんでした。この説明は真の区分です。そのため、この除算アルゴリズムの正式名称をコミュニティに確認したかったのです。
追加メモ: C および C++ に浮動小数点命令があることは認識しています。このアルゴリズムをハードウェア設計に実装しているため、このアルゴリズムを作成してテストしています。ただし、このアルゴリズムを使用したいのは、レイテンシが高い (私の組み込みプラットフォームでは問題ない) ものの、領域のオーバーヘッドが低いように見えるためです。
ありがとうございました