2012-03-15 5 views
3

に浮動小数点乗算機能を書くもちろん、私は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); 
} 
+0

仮数部と指数部を移植可能(ただし、ほとんどの場合ゆっくり)に設定/取得する 'ldexp/frexp'があります。 –

答えて

1

一覧を見る理由だけではなく、整数乗算演算子、*を使用して(そのint型の表現に抽出された)画分を掛けていませんか?

+0

彼は代入演算子しか使用できないと言った。 –

+5

いいえ、彼は**代入演算子以外の**浮動小数点**演算を使用できないと述べました。私は整数演算を使用して整数を掛けることを提案しています。 –

+0

touche '、私はあなたが意図したことを誤解しました。 –

0

24+ 24 < 64ですので、long longの乗算を使用できます。ロングロングは - (2^63-1)から(2^63-1)までの数字を保持するのに十分な大きさであることが保証されます

または、2つの部分(下位16ビット+上位8 32ビット乗算を使用します(unsigned longは少なくとも32ビットを提供することが保証されています)。

その後正常に結果を正規化してください。

+0

上記のワード長の計算のために、それは24ビットの入力です(それぞれの仮数に暗黙の先頭1があります)。 –

+0

@OliCharlesworth:良いキャッチ。 –

0

http://en.wikipedia.org/wiki/Floating_pointは参考になるかもしれません。仮数部には特定の範囲しかないので、これを考慮に入れて指数部を調整する必要があります

+0

BTW - われわれのおかげで私は6502プロセッサで浮動小数点演算を書いた。 –