Main Content

ネイティブ浮動小数点演算の ULP の考慮事項

無限の実数を有限のビット数で表現するには近似が必要です。この近似によって、浮動小数点計算で丸め誤差が発生することがあります。丸め誤差を測定するために、浮動小数点標準では相対誤差と ULP (Units in the Last Place) を使用します。相対誤差については、相対精度と ULP の考慮事項を参照してください。

指数範囲に上限がない場合、浮動小数点数 x の Units in Last Place (ULP) は、x をまたぐ直近の 2 つの浮動小数点数 a と b との間の距離を表します。IEEE-754 標準では、加算、乗算、除算などの基本的な算術演算の結果を正しく丸める必要があります。正しく丸められた結果とは、丸められた結果が正確な結果の 0.5 ULP 内であることを意味します。

IEEE-754 標準へのネイティブ浮動小数点演算子の準拠

HDL Coder™ におけるネイティブ浮動小数点テクノロジーは、浮動小数点演算の IEEE 標準に従っています。加算、減算、乗算、除算、逆数といった基本的な算術演算は、ULP 誤差をゼロにするために IEEE によって規定されています。これらの演算をネイティブ浮動小数点モードで実行した場合、生成された HDL コードから得られる数値結果が元の Simulink® モデルと一致します。

指数、対数、三角関数演算子といった高度な数学演算にはすべて、マシン固有の実装動作が伴います。これは、演算子がテイラー級数や remez 式に基づく反復的な実装を使用するためです。これらの演算子をネイティブ浮動小数点モードで使用すると、Simulink モデルと生成された HDL コード間の数値結果の誤差を比較的小さくすることができます。

数値結果の誤差を相対誤差または ULP として測定できます。これらの演算子の ULP が非ゼロでも、IEEE 標準に準拠していないわけではありません。1 ULP は相対誤差の 10^-7 と等しくなります。こうした比較的小さい誤差は、HDL テスト ベンチの生成時に ULP にカスタム許容誤差値を指定することで無視できます。たとえば、カスタム浮動小数点許容誤差として 1 ULP を指定することで、生成されたコードの検証時に誤差を無視することができます。詳細については、コンフィギュレーション パラメーター [浮動小数点許容誤差チェックの基準] および [許容誤差の値] を参照してください。

浮動小数点演算子の ULP 値

以下の表では、非ゼロの ULP をもつ浮動小数点演算子の ULP を列挙しています。これらの演算子に加えて、HDL Reciprocal ブロックの ULP は 5 です。

数学関数

Simulink ブロックデータ型ULP (Units in the Last Place) 誤差
expsingle 1
half1
logdouble1
single1
half1
log10single1
half1
10^usingle1
powsingle1
hypotsingle1

Math Operations

Simulink ブロックデータ型ULP (Units in the Last Place) 誤差
HDL Reciprocalsingle 5
Reciprocal Sqrtdouble1

三角関数

Simulink ブロックデータ型ULP (Units in the Last Place) 誤差
sindouble1
single2
half1
cosdouble1
single2
half1
tansingle3
asinsingle2
acossingle2
atansingle2
atan2single5
sinhsingle1
coshsingle1
tanhsingle1
asinhsingle2
acoshsingle2
atanhsingle3
sincossingle2

考慮事項

特定の浮動小数点入力値では、一部のブロックで MATLAB® のシミュレーション結果とは異なるシミュレーション結果となる場合があります。結果の相違を確認するには、コードを生成する前に、検証モデルの生成を有効にします。[コンフィギュレーション パラメーター] ダイアログ ボックスの [HDL コード生成] ペインで [検証モデルを生成] チェック ボックスをオンにします。

  • 複素数および InfNaN などの例外を含む計算を実行すると、ネイティブ浮動小数点による HDL シミュレーションの結果が Simulink のシミュレーション結果と異なるものになる可能性があります。たとえば、Inf で複素数入力を乗算すると、Simulink のシミュレーション結果は Infi となりますが、HDL のシミュレーション結果は NaN+Infi となります。

  • HDL Coder では、参照とネイティブ浮動小数点の両方の値が符号に関係なく NaN である場合、それらの値の間の不一致エラーは生成されません。

  • 負の数値の平方根または対数を計算すると、ネイティブ浮動小数点を使用した HDL のシミュレーション結果は 0 になります。この結果は、SystemVerilog DPI テスト ベンチを使用して設計を検証したときのシミュレーション結果と一致します。Simulink では、得られる結果は NaN になります。IEEE-754 標準に従って、負の数値の平方根または対数を計算すると、結果はその数値そのものになります。

  • Direct Lookup Table (n-D) への入力が浮動小数点データ型であっても、table の要素が小さいデータ型を使用している場合、生成される HDL コードは正しくない可能性があります。たとえば、入力のデータ型が single 型で、要素は uint8 型を使用する場合です。正確な HDL のシミュレーション結果を取得するには、入力信号とルックアップ テーブルの要素に対して同じデータ型を使用します。

  • 入力 -7.729179E28 または 7.729179E28 を指定した Cosine ブロックを使用する場合、生成される HDL コードの ULP は 4 です。他のすべての入力では、ULP は 2 です。

  • Math Function ブロックを使用して mod(a,b) または rem(a,b) を計算する場合、a を被除数、b を除数とすると、ネイティブ浮動小数点モードのシミュレーション結果は、次の場合の MATLAB のシミュレーション結果とは異なるものになります。

    • b is integer and ab>232 の場合、ネイティブ浮動小数点モードのシミュレーション結果は 0 になります。数値 ab の間の大きさにこのような有意差がある場合、この実装により、ターゲットの FPGA デバイス上の面積が節約されます。

    • ab is close to 223 の場合、ネイティブ浮動小数点モードのシミュレーション結果は MATLAB のシミュレーション結果と異なるものになる可能性があります。

参考

モデリング ガイドライン

関数

関連する例

詳細