Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

NaN を整数 0 にマッピングするコードの削除

以下の例は、NaN を整数ゼロにマッピングするコードの削除方法を示します。飽和が伴う浮動小数点から整数への変換に対して、Simulink® はシミュレーション中に NaN を整数ゼロに変換します。モデルに NaN の入力値が含まれる場合、コード ジェネレーターで NaN をゼロにマッピングするコードを生成するように指定できます。このコードを使用しない場合、標準 C では NaN を伴うすべての条件は false と評価されるため、シミュレーションとコード生成結果の間に不一致が生じます。

アプリケーションに NaN の入力値が存在しない場合、NaN を整数ゼロにマッピングするコードを削除できます。このコードを削除すると、生成されたコードのサイズが縮小し、処理が高速化します。

モデル例

コマンド ウィンドウにモデル名を入力してモデル例 rtwdemo_float_mul_for_net_slope_correction を開きます。

モデルには Data Type Conversion ブロックが含まれます。入力信号を single から uint8 に変換するようにモデルを設定します。

1. [データ型の変換] ダイアログ ボックスを開きます。[出力データ型] パラメーターに対し、uint8 を選択します。

2. [整数オーバーフローで飽和] パラメーターのチェック ボックスをオンにします。このパラメーターを選択すると、範囲外の信号値がデータ型で表現できる最小値または最大値のいずれかと等しくなることを指定します。

3. [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[サポート: 非有限数] パラメーターのチェック ボックスをオンにします。このパラメーターを選択すると、非有限データの生成と非有限データでの処理が有効になります。

最適化を使用しないコードの生成

1. ビルドと検査プロセス用に一時フォルダーを作成します。

2. [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[最適化] ペインで、[浮動小数点から整数への変換で NaN が 0 にマッピングされて飽和したコードを削除] パラメーターのチェック ボックスをオフにします。

3. モデルを作成します。

### Starting build procedure for: rtwdemo_float_mul_for_net_slope_correction
### Successful completion of build procedure for: rtwdemo_float_mul_for_net_slope_correction

Build Summary

Top model targets built:

Model                                       Action                        Rebuild Reason                                    
============================================================================================================================
rtwdemo_float_mul_for_net_slope_correction  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 11.246s

4. rtwdemo_float_mul_for_net_slope_correction.c 内で、生成されたステップ関数 rtwdemo_float_mul_for_net_slope_correction_step を検証します。

/* Model step function */
void rtwdemo_float_mul_for_net_slope_correction_step(void)
{
  /* DataTypeConversion: '<Root>/Data Type Conversion' incorporates:
   *  Inport: '<Root>/Input'
   */
  if (rtU.Input < 256.0F) {
    if (rtU.Input >= 0.0F) {
      /* Outport: '<Root>/Output' */
      rtY.Output = (uint8_T)rtU.Input;
    } else {
      /* Outport: '<Root>/Output' */
      rtY.Output = 0U;
    }
  } else if (rtU.Input >= 256.0F) {
    /* Outport: '<Root>/Output' */
    rtY.Output = MAX_uint8_T;
  } else {
    /* Outport: '<Root>/Output' */
    rtY.Output = 0U;
  }

  /* End of DataTypeConversion: '<Root>/Data Type Conversion' */
}

コード ジェネレーターは NaN を整数ゼロにマッピングする条件を適用します。この場合、生成されたコードは大きくなりますが、生成されたコードの結果はシミュレーション結果と一致します。

最適化を使用したコードの生成

1. [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。

2. [最適化] ペインで、[浮動小数点から整数への変換で NaN が 0 にマッピングされて飽和したコードを削除] パラメーターをオンにします。

3. モデルを作成します。

### Starting build procedure for: rtwdemo_float_mul_for_net_slope_correction
### Successful completion of build procedure for: rtwdemo_float_mul_for_net_slope_correction

Build Summary

Top model targets built:

Model                                       Action                        Rebuild Reason                   
===========================================================================================================
rtwdemo_float_mul_for_net_slope_correction  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 9.92s

4. rtwdemo_float_mul_for_net_slope_correction.c 内で、最適化を使用して生成されたステップ関数 rtwdemo_float_mul_for_net_slope_correction_step を検証します。

/* Model step function */
void rtwdemo_float_mul_for_net_slope_correction_step(void)
{
  /* DataTypeConversion: '<Root>/Data Type Conversion' incorporates:
   *  Inport: '<Root>/Input'
   */
  if (rtU.Input < 256.0F) {
    if (rtU.Input >= 0.0F) {
      /* Outport: '<Root>/Output' */
      rtY.Output = (uint8_T)rtU.Input;
    } else {
      /* Outport: '<Root>/Output' */
      rtY.Output = 0U;
    }
  } else {
    /* Outport: '<Root>/Output' */
    rtY.Output = MAX_uint8_T;
  }

  /* End of DataTypeConversion: '<Root>/Data Type Conversion' */
}

生成されたコードは NaN を 255 にマッピングし、整数ゼロにはマッピングしません。生成されたコードは、NaN を整数ゼロにマッピングする追加のコードがなく、より効率的です。ただし、生成されたコードを実行しても NaN 値に対するシミュレーションと同じ結果が得られない可能性があります。

参考

関連するトピック