に浮動小数点乗算機能を書くもちろん、私は2つの浮動小数点引数に取る関数を書くために割り当てられているとC言語で自分の乗算の結果を返します私は私のコンピュータサイエンスではC
float multiply(float foo, float bar);
:
は、私はCで表され、私はこれを行うことにより、指数及び画分を抽出したかのフローティングポイントを理解する=代入演算子以外の任意のライブラリまたは任意の浮動小数点演算を使用することはできないのです0
私は指数を(簡単に)加え、2つの端数を乗算する必要があることを理解します。事は、どこに分数を掛け始めるべきか分かりません。私は文字列(例:0.5は "80000000"となる)として16進表現に分数を変換し、そのようにビットを掛けるアルゴリズムを書くことを考えていましたが、私はCライブラリを使用できません私はそれをどうやってやるのか分かりません。誰かが私を正しい方向に向けることができますか?
編集:浮動小数点はすべてのシステムで同じ方法で表されない可能性があります。このコースでは、最初のビットが符号であり、次の8ビットが指数であり、最後の23ビットが小数であると仮定します。
編集:これは私が今までに得たものです。私が試してみて、2つの整数を乗算するとき、私は私のデバッガに(long long)((long long)xRep * (long long)yRep)
を入力しない限り、私はちょうどゼロを取得
#include <stdio.h>
union sp_item
{
float frep;
unsigned irep;
};
int main() {
float x = 0.25;
float y = 0.5;
union sp_item xUnion;
union sp_item yUnion;
xUnion.frep = x; yUnion.frep = y;
unsigned xExp = (xUnion.irep >> 23) - 0x7f;
unsigned yExp = (yUnion.irep >> 23) - 0x7f;
unsigned xRep = (xUnion.irep << 9);
unsigned yRep = (yUnion.irep << 9);
xRep = (xRep >> 1) | 0x80000000;
yRep = (yRep >> 1) | 0x80000000;
long long final = (long long)((long long)xRep * (long long)yRep);
printf("iRep: %x * 2^%d\n", xRep, xExp);
printf("iRep: %x * 2^%d\n", yRep, yExp);
printf("%01611x\n", final);
}
仮数部と指数部を移植可能(ただし、ほとんどの場合ゆっくり)に設定/取得する 'ldexp/frexp'があります。 –