2012-03-31 17 views
5

私は、VHDLテストベンチで使用するテストベクトルを生成するプログラムを作成中です。テストベンチは基本的に単精度浮動小数点加算器として動作するハードウェアをテストするので、ベクトルはIEEE 754標準に準拠します。floatからBigDecimalへの変換が危険なのですか?

とにかく、私の現在の生成計画では、浮動小数点値をBigDecimalに変換し、必要な算術演算を行い、次に浮動小数点数に変換します。これは危険ですか?精度が失われ、テストベクタに不正確な結果が生じる可能性がありますか? BigDecimalに変換したいので、丸めの問題を避けることができます。

これは結果を切り捨てますか?

BigDecimal repA = new BigDecimal(Float.toString(A)); 
BigDecimal repB = new BigDecimal(Float.toString(B)); 
BigDecimal repResult = repA.add(repB); 
float result = repResult.floatValue(); 

ここで、AおよびBは、いくつかのフロートです。

+0

浮動小数点数はすべての小数を表すことができないため、確かに精度が失われます。 – anubhava

+0

精度を失うことなくこれを達成できる方法はありますか? – Franklin

+1

あなたはそれが必要な正確さはどれくらいですか? –

答えて

5

浮動小数点の予想される制限内で正確な32ビット浮動ベクトルを使用することを目標とする場合、私はあなたのアプローチが好きです。最初に32ビット浮動小数点数からより高精度のオブジェクトに変換し、数ステップを実行してから32ビット浮動小数点に変換します。最後に、32ビット浮動小数点数で同じ一連のステップをネイティブに実行した場合よりも、丸め誤差が低くなる可能性があります。

32ビット浮動小数点を使用して計算をネイティブに実行しているハードウェアの予想される結果を正確にシミュレートすることを目標とする場合は、計算がより正確に実行されるため、テストの失敗を誤って報告するリスクがありますテスト対象のハードウェアよりも優れています。

+0

私は自分の質問を編集しました。私は正しいと思いますか? – Franklin

+0

あなたの例に基づいて、丸めの問題を回避したことはありません。ベクトルを浮動小数点として無作為に生成し、文字列に変換し、文字列をBigDecimalに変換して追加し、浮動小数点に変換し直すだけなら、浮動小数点の追加だけでは効果はありません。 – phatfingers

+0

モデリングされたハードウェアを見て、ラウンドではなく値を切り捨てます。私のソフトウェアの一部は、エッジケースとともにランダムなベクトルを生成することです。結果を丸めることはできません。そうしないと、ハードウェアが切り詰められてからテストが役に立たなくなります。 – Franklin

関連する問題