メインコンテンツ

浮動小数点変換のオーバーフロー

浮動小数点データ型間の変換時のオーバーフロー

説明

この欠陥は、浮動小数点数がより小さい浮動小数点データ型に変換されたときに発生します。変数に、元の数を表現するだけの十分なメモリがない場合、変換はオーバーフローします。

異なる浮動小数点型への正確なストレージ割り当てはプロセッサに依存します。ターゲット プロセッサ タイプ (-target)を参照してください。

リスク

オーバーフローにより、計算の結果が予期しない値になる場合があります。実装に使用している丸めモードに応じて、結果が無限大または最大の有限値になる可能性があります。以降の計算でオーバーフローの発生した変換の結果を使用しており、オーバーフローを考慮していない場合、予期しない結果になることがあります。

修正方法

修正方法は欠陥の根本原因によって異なります。多くの場合、結果の詳細には欠陥につながる一連のイベントが表示されます。このイベント リストを使用して、変換対象の変数がどのように現在の値を取得したのかを確認します。そのシーケンス内のどのイベントについても修正を実装できます。結果の詳細にイベント履歴が表示されない場合は、ソース コード内で右クリック オプションを使用して逆のトレースを行い、これまでの関連するイベントを確認できます。Polyspace デスクトップ ユーザー インターフェイスでの Bug Finder の結果の解釈またはPolyspace Access Web インターフェイスでの Bug Finder の結果の解釈 (Polyspace Access)も参照してください。

この欠陥は次のようにして修正できます。

  • すべての値に適応できるように、変換の結果に対してより大きいデータ型を使用。

  • オーバーフローにつながる値をチェックし、適切なエラー処理を実行。

一般的に、より小さい浮動小数点型への変換は避けます。

以下の修正例を参照してください。

問題を修正しない場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。

既定では、Bug Finder 解析は無限大と NaNs を認識しません。結果が無限大および NaNs になる演算には、欠陥としてフラグが設定される可能性があります。コードで無限大および NaN の値を処理するには、オプション [非有限の浮動小数点を検討] (-allow-non-finite-floats) を使用します。

チェッカーの拡張

入力値が不明であり、入力のサブセットのみがエラーの原因となっている場合、既定の Bug Finder 解析ではこの欠陥が報告されない可能性があります。特定のシステム入力値を原因とする欠陥の有無をチェックするには、より厳密な Bug Finder 解析を実行してください。特定のシステム入力値から欠陥を見つけるための Bug Finder チェッカーの拡張を参照してください。

すべて展開する

float convert(void) {

    double diam = 1e100;
    return (float)diam;
}

return ステートメントで、double 型 (64 ビット) の変数 diam が float 型 (32 ビット) の変数に変換されています。しかし値 1^100 を正確に表現するには、33 ビット以上が必要です。

結果情報

グループ: 数値
言語: C | C++
既定値: オン
コマンド ライン構文: FLOAT_CONV_OVFL
影響度: High

バージョン履歴

R2013b で導入

すべて展開する