2017-11-09 10 views
2

ある固定小数点表現から別の固定小数点表現に数値を変換しようとしています。私は2の補数表現(Qmf表現)を使用しています これは、ハードウェア実装を検証するためです。ハードウェア実装は次のように機能します。2つの固定小数点表現の間の変換

入力データはQmf形式です。入力データは8ビット幅で、6ビットの長さがあります。私はそれを4つの小数ビット(整数ビットなし)で4ビット数に変換したいと思います。同じことについていくつかの疑問があります。

Q26 {range [-2,1.984375]}フォーマットから1.984375のような数字をQ04 {range [-0.5,0.4375]}フォーマットに変換しようとすると、ハードウェアの実装は次のようになります。 Iビット6 & 7が整数部に使用され、4ビットレジスタに格納されるため、ビット5-2を読み込みます。したがって、この値はQ04形式に変換されたときに-0.5と解釈されます。 -0.5は正しいですか?発生するエラーの量は膨大であるようです。私は何か間違っているのですか? 上記の方法が正しい場合。上で説明したハードウェアアプローチを模倣するソフトウェアで、ある固定小数点表現から別の固定小数点表現に変換する標準的な手順はありますか?私はQ26表現から浮動小数点数に変換し、それを固定小数点に変換することを考えています。ソフトウェアでこれを行うよりクリーンな方法がありますか?

+0

Q26番号がQ04形式で保存できる最大値よりも大きいため、変換ではエラー(オーバーフロー)が報告されるか、可能な限り最大値が返されます。 – 1201ProgramAlarm

+0

あなたのQ0.4フォーマットは、[範囲-0.5 .. + 0.4375]または符号なし[0..0.9375]と署名されていますか? – NickJH

+0

私は署名された表現を使用しています。 – a220599

答えて

0

私は単純なビットマスキング操作と少しのロジックで変換を実行できると思います。

Q26番号が正の場合(つまりビット7がゼロの場合)、ビット6がゼロの場合、対応するQ04番号は元の番号のビット2からビット5になります。つまり、元の数は1未満でなければなりません。

Q26番号が負の場合(つまりビット7が1の場合)、対応するQ04番号はビット2〜ビット5または元の番号ですが、今回はビット6が1の場合ビット2〜5において、少なくとも非ゼロビットである。つまり、元の数はマイナス1より大きくなければなりません。

いずれの場合も、ビット0 & 1を無視すると丸め誤差が発生します。これは、Q04番号の最下位ビットに1を加算または減算することで考慮する必要があります。それは明らかに余分な算術演算を必要とし、Q04番号の許容範囲をオーバーフローさせるリスクがあります。

これをPythonで試してみたい場合は、spfpmのようなライブラリを試してみてください。

関連する問題