このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
NaN を整数 0 にマッピングするコードの削除
以下の例は、NaN
を整数ゼロにマッピングするコードの削除方法を示します。飽和が伴う浮動小数点から整数への変換に対して、Simulink® はシミュレーション中に NaN を整数ゼロに変換します。モデルに NaN
の入力値が含まれる場合、コード ジェネレーターで NaN をゼロにマッピングするコードを生成するように指定できます。このコードを使用しない場合、標準 C では NaN
を伴うすべての条件は false と評価されるため、シミュレーションとコード生成結果の間に不一致が生じます。
アプリケーションに NaN
の入力値が存在しない場合、NaN を整数ゼロにマッピングするコードを削除できます。このコードを削除すると、生成されたコードのサイズが縮小し、処理が高速化します。
モデル例
コマンド ウィンドウにモデル名を入力してモデル例 FloatMultiplicationNetSlope
を開きます。
モデルには Data Type Conversion ブロックが含まれます。入力信号を single
から uint8
に変換するようにモデルを設定します。
1. [データ型の変換] ダイアログ ボックスを開きます。[出力データ型] パラメーターに対し、uint8
を選択します。
2. [整数オーバーフローで飽和] パラメーターのチェック ボックスをオンにします。このパラメーターを選択すると、範囲外の信号値がデータ型で表現できる最小値または最大値のいずれかと等しくなることを指定します。
3. [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[サポート: 非有限数] パラメーターのチェック ボックスをオンにします。このパラメーターを選択すると、非有限データの生成と非有限データでの処理が有効になります。
最適化を使用しないコードの生成
1. [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[最適化] ペインで、[浮動小数点から整数への変換で NaN が 0 にマッピングされて飽和したコードを削除] パラメーターのチェック ボックスをオフにします。
2. モデルを作成します。
### Starting build procedure for: FloatMultiplicationNetSlope ### Successful completion of build procedure for: FloatMultiplicationNetSlope Build Summary Top model targets built: Model Action Rebuild Reason ============================================================================================================= FloatMultiplicationNetSlope Code generated and compiled. Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 10.003s
3. FloatMultiplicationNetSlope.c
内に生成されたステップ関数 FloatMultiplicationNetSlope_step
を検査します。
/* Model step function */ void FloatMultiplicationNetSlope_step(void) { /* DataTypeConversion: '<Root>/Data Type Conversion' incorporates: * Inport: '<Root>/Input' */ if (FloatMultiplicationNetSlope_U.Input < 256.0F) { if (FloatMultiplicationNetSlope_U.Input >= 0.0F) { /* Outport: '<Root>/Output' */ FloatMultiplicationNetSlope_Y.Output = (uint8_T) FloatMultiplicationNetSlope_U.Input; } else { /* Outport: '<Root>/Output' */ FloatMultiplicationNetSlope_Y.Output = 0U; } } else if (FloatMultiplicationNetSlope_U.Input >= 256.0F) { /* Outport: '<Root>/Output' */ FloatMultiplicationNetSlope_Y.Output = MAX_uint8_T; } else { /* Outport: '<Root>/Output' */ FloatMultiplicationNetSlope_Y.Output = 0U; } /* End of DataTypeConversion: '<Root>/Data Type Conversion' */ }
コード ジェネレーターは NaN
を整数ゼロにマッピングする条件を適用します。この場合、生成されたコードは大きくなりますが、生成されたコードの結果はシミュレーション結果と一致します。
最適化を使用したコードの生成
1. [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。
2. [最適化] ペインで、[浮動小数点から整数への変換で NaN が 0 にマッピングされて飽和したコードを削除] パラメーターをオンにします。
3. モデルを作成します。
### Starting build procedure for: FloatMultiplicationNetSlope ### Successful completion of build procedure for: FloatMultiplicationNetSlope Build Summary Top model targets built: Model Action Rebuild Reason ============================================================================================ FloatMultiplicationNetSlope Code generated and compiled. Generated code was out of date. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 6.4732s
4. FloatMultiplicationNetSlope.c
内で、最適化を使用して生成されたステップ関数 FloatMultiplicationNetSlope_step
を検査します。
/* Model step function */ void FloatMultiplicationNetSlope_step(void) { /* DataTypeConversion: '<Root>/Data Type Conversion' incorporates: * Inport: '<Root>/Input' */ if (FloatMultiplicationNetSlope_U.Input < 256.0F) { if (FloatMultiplicationNetSlope_U.Input >= 0.0F) { /* Outport: '<Root>/Output' */ FloatMultiplicationNetSlope_Y.Output = (uint8_T) FloatMultiplicationNetSlope_U.Input; } else { /* Outport: '<Root>/Output' */ FloatMultiplicationNetSlope_Y.Output = 0U; } } else { /* Outport: '<Root>/Output' */ FloatMultiplicationNetSlope_Y.Output = MAX_uint8_T; } /* End of DataTypeConversion: '<Root>/Data Type Conversion' */ }
生成されたコードは NaN
を 255 にマッピングし、整数ゼロにはマッピングしません。生成されたコードは、NaN を整数ゼロにマッピングする追加のコードがなく、より効率的です。ただし、生成されたコードを実行しても NaN
値に対するシミュレーションと同じ結果が得られない可能性があります。
参考
浮動小数点から整数への変換で NaN が 0 にマッピングされて飽和したコードを削除