このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
範囲外の浮動小数点を整数へ変換するコードの削除
この例では、範囲外の浮動小数点を整数に変換するコードを削除することで、最適化されたコードを生成する方法を説明します。標準 C は範囲外の浮動小数点から整数への変換の動作を定義しませんが、これらの変換はシミュレーション中に適切に定義されます。コンフィギュレーション パラメーター [範囲外の値をラップする浮動小数点から整数への変換コードを削除] を選択すると、コード ジェネレーターは範囲外の浮動小数点から整数への変換を処理するラッピング コードを削除して、コードの効率を改善します。このコードを使用しない場合、範囲外の値に対するシミュレーションとコード生成の結果の間に不一致が生じる可能性があります。
アプリケーションにおける入力値が出力型の範囲にある場合、範囲外の浮動小数点から整数への変換コードを削除します。このコードを削除すると、生成されたコードのサイズが縮小し、処理が高速化します。
モデル例
モデル例 FloatMultiplicationNetSlope を開きます。
model = 'FloatMultiplicationNetSlope';
open_system(model);

モデルには Data Type Conversion ブロックが含まれます。入力信号を single から uint8 に変換するようにモデルを設定するには、[データ型の変換] ダイアログ ボックスを開きます。[出力データ型] パラメーターに対し、uint8 を選択します。あるいは、以下のようにコマンド ライン API を使用して、[出力データ型] を設定します。
set_param('FloatMultiplicationNetSlope/Data Type Conversion', 'OutDataTypeStr','uint8');
uint8 は 0 から 255 までの値をサポートできます。入力信号にこの範囲外の値がある場合、範囲外の変換が行われます。
最適化を使用しないコードの生成
1. [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[最適化] ペインで、[範囲外の値をラップする浮動小数点から整数への変換コードを削除] パラメーター チェック ボックスをオフにします。あるいは、コマンド ライン API を使用して最適化を無効にします。
set_param(model, 'EfficientFloat2IntCast','off');
2. 関数 slbuild を使用するか、"Ctrl+B" を押して、モデルをビルドします。
slbuild(model)
### Searching for referenced models in model 'FloatMultiplicationNetSlope'. ### Total of 1 models to build. ### Starting build procedure for: FloatMultiplicationNetSlope ### Successful completion of build procedure for: FloatMultiplicationNetSlope Build Summary Top model targets: Model Build Reason Status Build Duration ============================================================================================================================== FloatMultiplicationNetSlope Information cache folder or artifacts were missing. Code generated and compiled. 0h 0m 7.6437s 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 8.1382s
3. FloatMultiplicationNetSlope.c 内に生成されたステップ関数 FloatMultiplicationNetSlope_step を検査します。
file = fullfile('FloatMultiplicationNetSlope_grt_rtw','FloatMultiplicationNetSlope.c'); coder.example.extractLines(file,'/* Model step function */','/* Model initialize function',1,1);
/* Model step function */
void FloatMultiplicationNetSlope_step(void)
{
real32_T tmp;
/* DataTypeConversion: '<Root>/Data Type Conversion' incorporates:
* Inport: '<Root>/Input'
*/
tmp = (real32_T)floor(FloatMultiplicationNetSlope_U.Input);
if (rtIsNaNF(tmp) || rtIsInfF(tmp)) {
tmp = 0.0F;
} else {
tmp = (real32_T)fmod(tmp, 256.0);
}
if (tmp < 0.0F) {
/* Outport: '<Root>/Output' */
FloatMultiplicationNetSlope_Y.Output = (uint8_T)-(int8_T)(uint8_T)-tmp;
} else {
/* Outport: '<Root>/Output' */
FloatMultiplicationNetSlope_Y.Output = (uint8_T)tmp;
}
/* End of DataTypeConversion: '<Root>/Data Type Conversion' */
}
コード ジェネレーターは、範囲外の結果を処理するために、関数 fmod を適用します。この場合、生成されたコードは大きくなりますが、生成されたコードの結果はシミュレーション結果と一致します。
最適化を使用したコードの生成
1. [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[最適化] ペインで、[範囲外の値をラップする浮動小数点から整数への変換コードを削除] パラメーターを選択します。あるいは、コマンド ライン API を使用して最適化を有効にします。
set_param(model, 'EfficientFloat2IntCast','on')
2. モデルをビルドします。FloatMultiplicationNetSlope.c 内で、最適化を使用して生成されたステップ関数 FloatMultiplicationNetSlope_step を検査します。
slbuild(model); file = fullfile('FloatMultiplicationNetSlope_grt_rtw','FloatMultiplicationNetSlope.c'); coder.example.extractLines(file,'/* Model step function */','/* Model initialize function',1,1);
### Searching for referenced models in model 'FloatMultiplicationNetSlope'.
### Total of 1 models to build.
### Starting build procedure for: FloatMultiplicationNetSlope
### Successful completion of build procedure for: FloatMultiplicationNetSlope
Build Summary
Top model targets:
Model Build Reason Status Build Duration
==========================================================================================================
FloatMultiplicationNetSlope Generated code was out of date. Code generated and compiled. 0h 0m 5.6876s
1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 6.2174s
/* Model step function */
void FloatMultiplicationNetSlope_step(void)
{
/* Outport: '<Root>/Output' incorporates:
* DataTypeConversion: '<Root>/Data Type Conversion'
* Inport: '<Root>/Input'
*/
FloatMultiplicationNetSlope_Y.Output = (uint8_T)
FloatMultiplicationNetSlope_U.Input;
}
生成されたコードは保護コードを使用しない方が効率的ですが、生成されたコードを実行しても 0 から 255 の範囲にない値に対するシミュレーションと同じ結果が得られない可能性があります。
例のフォルダーおよびファイルのクリーン アップ
モデルを閉じて、一時フォルダーおよびファイルを削除します。
bdclose(model);
参考
範囲外の値をラップする浮動小数点から整数への変換コードを削除