2009-03-03 16 views
0

マイクロコントローラで浮動小数点演算を実装しようとしていますが、これまでに十分な成功を収めています。long longのないシステムで23ビットのデータ型を掛ける

問題は、私は私のコンピュータで乗算を行う方法であり、それが正常に動作します:

unsigned long long gig,mm1,mm2; 
unsigned long m,m1,m2; 
mm1 = f1.float_parts.mantissa; 
mm2 = f2.float_parts.mantissa; 

m1 = f1.float_parts.mantissa; 
m2 = f2.float_parts.mantissa; 



gig = mm1*mm2; //this works fine I get all the bits I need since they are all long long, but won't work in the mcu 

gig = m1*m2//this does not work, to be precise it gives only the 32 least significant bits , but works on the mcu 

だから、あなたは私の問題は、私がしようとした場合、マイクロコントローラは__muldi3に未定義refenceを投げるということであることがわかりますgig = mm1*mm2があります。

小さなデータ型で試してみると、最下位ビットしか保持しませんが、これは必要ありません。私は製品の23 msbのビットが必要です。

私はこれをどのように行うことができますか?

答えて

1

短い答えをお詫び申し上げます。誰かが完全な説明を書くのに時間がかかることを願っていますが、基本的には2つの大きな数字を手で紙に乗せたときとまったく同じです。ベース10で作業するのではなく、ベース256で作業します。つまり、数値をバイトベクトルとして扱い、 "手で乗算する"ときには、それぞれのバイトで何を行うかを指定します。

0

2つの16ビット数(32ビット?whoow)を掛け合わせたとき、インテル8088(元のPC CPUと最後のCPU用のアセンブリコードを書きました)に戻って、CPUは2つの異なるレジスタ1つは16 msb、もう1つはlsbです。

マイクロコントローラのハードウェア機能を確認してください。おそらく同様の設定です(明らかに、アセンブリにコードが必要です)。

それ以外の場合は、独自に乗算を実装する必要があります。

1

__muldi3()のFreeBSD実装のコメントには、必要な手順についての説明があります。muldi3.cを参照してください。コメントによれば、このコードはKnuthのThe Art of Computer Programming volに記述されているアルゴリズムに基づいています。 2(第2版)、第4.3.3項、p。 278.(N.B.リンクは第3版用です)

関連する問題