Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

範囲外の浮動小数点を整数へ変換するコードの削除

この例では、範囲外の浮動小数点を整数に変換するコードを削除することで、最適化されたコードを生成する方法を説明します。標準 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)
### 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 9.6025s

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);
### 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 7.3637s

/* 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);

参考

関連するトピック