Main Content

ターゲット システムの標準の数学ライブラリの設定

コード ジェネレーターが数学演算に使用する標準ライブラリ拡張を指定します。新しいモデルまたは新しいコンフィギュレーション セット オブジェクトをもつモデルのコードを生成する場合、コード ジェネレーターは既定で ISO®/IEC 9899:1999 C (C99 (ISO)) ライブラリを使用します。既存のモデルおよび既存のコンフィギュレーション セット オブジェクトについては、コード ジェネレーターは [標準の数学ライブラリ] パラメーターで指定されているライブラリを使用します。

コンパイラが ISO®/IEC 9899:1990 (C89/C90 (ANSI))、ISO/IEC 14882:2003(C++03 (ISO) または ISO/IEC 14882:2011(C++11 (ISO)) 数学ライブラリ拡張をサポートしている場合、標準の数学ライブラリの設定を変更できます。C++03 (ISO) または C++11 (ISO) ライブラリは、プログラミング言語に C++ を選択する場合に使用できます。

C99 ライブラリは、コンパイラによって提供される標準の ANSI C を超えるパフォーマンスを活用します。C99 ライブラリを使用すると、コード ジェネレーターは可能な場合 ISO C 関数の呼び出しを生成します。たとえば、生成コードでは、sqrt() の代わりに単精度データの演算を行う関数 sqrtf() を呼び出します。

ライブラリの設定を変更するには、[コンフィギュレーション パラメーター]、[標準の数学ライブラリ] パラメーターを使用します。コマンド ラインの対応するコマンドは TargetLangStandard です。

ANSI C コードの生成と検査

1. モデル例 CStandardMathLib を開きます。

2. コードを生成します。

### Starting build procedure for: CStandardMathLib
### Successful completion of code generation for: CStandardMathLib

Build Summary

Top model targets built:

Model             Action           Rebuild Reason                                    
=====================================================================================
CStandardMathLib  Code generated.  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 36.436s

3. 生成されたファイル CStandardMathLib.c のコードを調べます。コードでは関数 sqrt を呼び出していることに注意します。

  if (rtb_Abs2 < 0.0F) {
    rtb_Abs2 = -(real32_T)sqrt((real32_T)fabs(rtb_Abs2));
  } else {
    rtb_Abs2 = (real32_T)sqrt(rtb_Abs2);
  }

  /* Gain: '<Root>/Gain1' incorporates:
   *  Constant: '<Root>/Constant'
   *  Sqrt: '<Root>/get_hypot1'
   *  Sum: '<Root>/Sum'
   *
   * About '<Root>/get_hypot1':
   *  Operator: signedSqrt
   */
  rtb_Abs2 = (rtb_Abs2 - 1.0F) * 343.0F;

  /* Rounding: '<Root>/fix1' */
  if (rtb_Abs2 < 0.0F) {
    /* Outport: '<Root>/Out1' */
    CStandardMathLib_Y.Out1 = (real32_T)ceil(rtb_Abs2);
  } else {
    /* Outport: '<Root>/Out1' */
    CStandardMathLib_Y.Out1 = (real32_T)floor(rtb_Abs2);
  }

  /* End of Rounding: '<Root>/fix1' */

  /* Abs: '<Root>/Abs2' incorporates:
   *  Inport: '<Root>/In2'
   */
  rtb_Abs2 = (real32_T)fabs(CStandardMathLib_U.In2);

  /* Outport: '<Root>/Out2' incorporates:
   *  Constant: '<Root>/Constant1'
   *  Gain: '<Root>/Gain2'
   *  Math: '<Root>/get_hypot2'
   *  Rounding: '<Root>/fix2'
   *  Sum: '<Root>/Sum2'
   *  Trigonometry: '<S1>/cos'
   *  Trigonometry: '<S1>/sin'
   */
  CStandardMathLib_Y.Out2 = (real32_T)floor((rt_hypotf_snf((real32_T)sin
    (rtb_Abs2), (real32_T)cos(rtb_Abs2)) - 1.0F) * 343.0F);
}

/* Model initialize function */
void CStandardMathLib_initialize(void)
{
  /* Registration code */

  /* initialize non-finites */
  rt_InitInfAndNaN(sizeof(real_T));

  /* initialize error status */
  rtmSetErrorStatus(CStandardMathLib_M, (NULL));

  /* external inputs */
  (void)memset(&CStandardMathLib_U, 0, sizeof(ExtU_CStandardMathLib_T));

  /* external outputs */
  (void)memset(&CStandardMathLib_Y, 0, sizeof(ExtY_CStandardMathLib_T));
}

/* Model terminate function */
void CStandardMathLib_terminate(void)
{
  /* (no terminate code required) */
}

ISO C コードの生成と検査

1. [標準の数学ライブラリ] の設定を C99 (ISO) に変更します。または、コマンド ラインで、TargetLangStandardC99 (ISO) に設定します。

2. コードを再度生成します。

### Starting build procedure for: CStandardMathLib
### Successful completion of code generation for: CStandardMathLib

Build Summary

Top model targets built:

Model             Action           Rebuild Reason                                    
=====================================================================================
CStandardMathLib  Code generated.  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 18.245s

3. 生成されたファイル CStandardMathLib.c のコードを再度調べます。生成されたコードでは sqrt ではなく関数 sqrtf を呼び出すようになりました。

  if (rtb_Abs2 < 0.0F) {
    rtb_Abs2 = -sqrtf(fabsf(rtb_Abs2));
  } else {
    rtb_Abs2 = sqrtf(rtb_Abs2);
  }

  /* Outport: '<Root>/Out1' incorporates:
   *  Constant: '<Root>/Constant'
   *  Gain: '<Root>/Gain1'
   *  Rounding: '<Root>/fix1'
   *  Sqrt: '<Root>/get_hypot1'
   *  Sum: '<Root>/Sum'
   *
   * About '<Root>/get_hypot1':
   *  Operator: signedSqrt
   */
  CStandardMathLib_Y.Out1 = truncf((rtb_Abs2 - 1.0F) * 343.0F);

  /* Abs: '<Root>/Abs2' incorporates:
   *  Inport: '<Root>/In2'
   */
  rtb_Abs2 = fabsf(CStandardMathLib_U.In2);

  /* Outport: '<Root>/Out2' incorporates:
   *  Constant: '<Root>/Constant1'
   *  Gain: '<Root>/Gain2'
   *  Math: '<Root>/get_hypot2'
   *  Rounding: '<Root>/fix2'
   *  Sum: '<Root>/Sum2'
   *  Trigonometry: '<S1>/cos'
   *  Trigonometry: '<S1>/sin'
   */
  CStandardMathLib_Y.Out2 = floorf((rt_hypotf_snf(sinf(rtb_Abs2), cosf(rtb_Abs2))
    - 1.0F) * 343.0F);
}

/* Model initialize function */
void CStandardMathLib_initialize(void)
{
  /* Registration code */

  /* initialize non-finites */
  rt_InitInfAndNaN(sizeof(real_T));

  /* initialize error status */
  rtmSetErrorStatus(CStandardMathLib_M, (NULL));

  /* external inputs */
  (void)memset(&CStandardMathLib_U, 0, sizeof(ExtU_CStandardMathLib_T));

  /* external outputs */
  (void)memset(&CStandardMathLib_Y, 0, sizeof(ExtY_CStandardMathLib_T));
}

/* Model terminate function */
void CStandardMathLib_terminate(void)
{
  /* (no terminate code required) */
}

関連情報