オーバーフローの検出
この例では、関数 fiaccel
を使用したオーバーフローの検出方法について説明します。変換プロセスの数値テストの段階では、ツールはスケーリングされた double を使用して固定小数点コードのシミュレーションを実行します。その後、生成されたコード内で固定小数点データ型のオーバーフローを発生させる可能性のある値を生成する式をレポートします。
必要条件
この例を実行するには、次の製品をインストールしなければなりません。
MATLAB®
Fixed-Point Designer™
C コンパイラ
サポートされるコンパイラ を参照してください。
mex -setup
を使用して既定のコンパイラを変更できます。既定のコンパイラの変更を参照してください。
新規フォルダーの作成と関連ファイルのコピー
ローカル作業フォルダーを作成します。たとえば、
c:\overflow
のようにします。docroot\toolbox\fixpoint\examples
フォルダーに変更します。MATLAB コマンド ラインで次のように入力します。cd(fullfile(docroot, 'toolbox', 'fixpoint', 'examples'))
overflow.m
およびoverflow_test.m
ファイルをローカル作業フォルダーにコピーします。入力の読み込みや、入力値の設定、テストする関数の呼び出し、テスト結果の出力など、すべての前処理と後処理を実行するための独立したテスト スクリプトを作成することをお勧めします。
タイプ 名前 説明 関数のコード overflow.m
MATLAB のエントリポイント関数 テスト ファイル overflow_test.m
MATLAB スクリプト。次をテストします。 overflow.m
構成オブジェクトの設定
coder.FixptConfig
オブジェクトfixptcfg
を既定の設定で作成します。fixptcfg = coder.config('fixpt');
テスト ベンチの名前を設定します。この例では、テスト ベンチ関数名は
overflow_test
です。fixptcfg.TestBenchName = 'overflow_test';
既定の語長を 16 に設定します。
fixptcfg.DefaultWordLength = 16;
オーバーフロー検出の有効化
fixptcfg.TestNumerics = true; fixptcfg.DetectFixptOverflows = true;
fimath オプションの設定
fimath
Product mode
および Sum mode
を KeepLSB
に設定します。これらの設定は C 言語の整数演算の動作をモデル化します。
fixptcfg.fimath = 'fimath( ''RoundingMethod'', ''Floor'', ''OverflowAction'', ''Wrap'', ''ProductMode'', ''KeepLSB'', ''SumMode'', ''KeepLSB'')';
固定小数点への変換
浮動小数点の MATLAB 関数 overflow
を固定小数点の MATLAB コードに変換します。テスト ファイルから型が推測されるので、fiaccel
コマンドの入力型を指定する必要はありません。
fiaccel -float2fixed fixptcfg overflow
数値テスト段階でオーバーフローがレポートされます。
Overflow error in expression 'acc + b( j )*z( k )'. Percentage of Current Range = 104%.
結果のレビュー
この式内の加算または乗算がオーバーフローしているか判断します。乗算がオーバーフローしないように fimath
ProductMode を FullPrecision
に設定し、fiaccel
コマンドを再度実行します。
fixptcfg.fimath = 'fimath( ''RoundingMethod'', ''Floor'', ''OverflowAction'', ''Wrap'', ''ProductMode'', ''FullPrecision'', ''SumMode'', ''KeepLSB'')'; fiaccel -float2fixed fixptcfg overflow
数値テスト段階で、継続してオーバーフローがレポートされ、式の加算でオーバーフローしていることが示されます。