Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

ネイティブ浮動小数点での数値の考慮事項

ネイティブ浮動小数点テクノロジーによって、浮動小数点設計から HDL コードを生成できます。浮動小数点設計では、固定小数点設計に比べて、精度が向上し、ダイナミック レンジが高くなり、開発サイクルが短縮されます。設計に複雑な算術演算および三角関数演算がある場合は、ネイティブ浮動小数点テクノロジーを使用します。

HDL Coder™ は、浮動小数点演算の IEEE 754 標準に準拠したコードを生成します。HDL Coder のネイティブ浮動小数点は、以下をサポートしています。

  • 最も近い整数方向への丸めモード

  • 非正規数

  • NaN (非数)、Inf、ゼロなどの例外

  • ULP (Units in the Last Place) および相対精度のカスタマイズ

最も近い整数方向への丸めモード

HDL Coder のネイティブ浮動小数点は、最も近い偶数の整数方向への丸めモードを使用します。このモードは、最も近い偶数に丸めてすべての同順位を解決します。

この丸め手法では、仮数の 23 ビットの後に最後のビットとして少なくとも 3 ビットが必要です。MSB はガード ビット、ミドル ビットはラウンド ビット、LSB はスティッキー ビットと呼ばれます。次の表は、HDL Coder で最後の 3 ビットの各値に基づいて実行される丸めアクションを示します。x は、don’t care 値であり、0 または 1 のいずれかを取ります。

丸めビット丸めアクション
0xx

アクションは実行されない。

100同順位。ガード ビットの前にある仮数ビットが 1 である場合は丸められ、それ以外の場合は何も実行されない。
101丸められる。
11x丸められる。

非正規数

非正規数は、ゼロに等しい指数フィールドおよび非ゼロ仮数フィールドをもつ数値です。仮数の最初のビットはゼロです。

value=(1)sign*(0+Σ23i=1b23i2i)*2126

非正規数の大きさは、仮数の先頭にゼロを付けずに表現できる最小の浮動小数点数より小さくなります。非正規数が存在する場合は有効桁数の損失を示し、以降の演算で累積されて最終的に予期しない値になる可能性があります。

非正規数を処理するロジックでは、先頭のゼロの数をカウントし、左シフト演算を実行して正規化された表現を得ることが必要です。このロジックを追加することで、ターゲット デバイスの面積のフットプリントが増え、設計のタイミングに影響を与える可能性があります。

ネイティブ浮動小数点のサポートを使用する場合は、HDL Coder によって設計の非正規数を処理するかどうかを指定できます。既定の設定では、コード ジェネレーターは非正規数をチェックしないため、ターゲット プラットフォームの面積が節約されます。

例外処理

ゼロ除算などの演算を実行したり、負の数値の対数を計算する場合、HDL Coder によって例外が検出および報告されます。次の表は、浮動小数点数のエンコードからさまざまな種類の例外を表す数値へのマッピングをまとめています。xdon’t care 値を示し、0 または 1 の値を取ることができます。

符号指数仮数説明
x0xFF0x00000000

value=(1)S

無限大
x0xFF非ゼロ値

value = NaN

非数値
x0x000x00000000

value = 0

ゼロ
x0x00非ゼロ値

value=(1)sign*(0+Σ23i=1b23i2i)*2126

非正規
x0x00 < E < 0xFFx

value=(1)sign*(1+Σ23i=1b23i2i)*2(e127)

ノーマル

相対精度と ULP の考慮事項

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

ULP

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

ULP が 1 の場合は、10 進数値に 1 を加算することを意味します。次の表は、9 桁の 10 進数に対する pi の近似と、1 ULP でこの近似値がどのように変化するかを示しています。

浮動小数点数10 進数の値single 型の IEEE-754 表現ULP
3.14159274110785300110|10000000|100100100001111110110110
3.14159297910785300120|10000000|100100100001111110111001

2 つの連続的に表現可能な浮動小数点数間のギャップは、絶対値に応じて変わります。

浮動小数点数10 進数の値single 型の IEEE-754 表現ULP
123456712346133040|10010011|001011010110100001110000
1234567.12512346133050|10010011|001011010110100001110011

相対誤差

相対誤差は、浮動小数点数と実数の近似との間の差を測定します。相対誤差は、1.0 から次に大きい数までの距離を返します。次の表に、相対精度による数値の実数の変化を示します。

浮動小数点数10 進数の値 single 型の IEEE-754 表現ULP相対誤差
838860812582912000|10010110|0000000000000000000000001
838860712582911980|10010101|1111111111111111111111012.3841858e-07
110653532160|01111111|0000000000000000000000001.1920929e-07
210737418240|10000000|0000000000000000000000012.3841858e-07

相対誤差の大きさは、浮動小数点数の実数値に応じて変わります。

MATLAB® では、関数 eps で浮動小数点の相対精度を測定します。詳細については、eps を参照してください。

参考

モデリング ガイドライン

関数

関連する例

詳細