Renesas Synergy™

FAQ 104034 : SH-4の浮動小数点演算結果が期待値と異なります。

回答

コンパイラのfpuオプションと、SH-4にあるFPCSRレジスタのPRビット値の対応を確認してください。
コンパイラのdenormalizeオプションと、SH-4にあるFPCSRレジスタのDNビット値の対応を確認してください。
コンパイラのroundオプションと、SH-4にあるFPCSRレジスタのRMビット値の対応を確認してください。

fpuオプションは、fpu=single, doubleの2種類が選択可能です。

  • "fpu=single"を選択した場合
    全ての浮動小数点データを単精度浮動小数点データとして扱います。
  • "fpu=double"を選択した場合
    全ての浮動小数点データを倍精度浮動小数点データとして扱います。
fpuオプションを使用しない場合
ソースコードの宣言型通りに浮動小数点データを扱います。
コンパイラは、浮動小数点の演算時にその精度に応じてPRビットを変更するコードを生成しますが、"fpu=single"または"fpu=double"を選択した場合には、コンパイラはPRビットにアクセスするコードを一切生成しません。

一方、SH-4にあるFPSCRレジスタのPRビットは、リセット時に0に初期化されます。
そのため、

  • fpuオプションを使用しない場合、または、"fpu=single"を選択した場合
    PRビットを意識しなくても正しく動作
  • "fpu=double"を選択した場合
    FPU演算前に、PRビットを1に変更する必要がある

denormalize, roundオプションについても、以下の選択が必要になります。

[非正規化モード]

  • "denormalize=ON"オプションを選択している場合
    FPSCRのDNビットが0に設定されていることを確認してください。
  • "denormalize=OFF"オプションを選択している場合
    FPSCRのDNビットが1に設定されていることを確認してください。

[丸めモード]

  • "round=zero"オプションを選択している場合
    FPSCRのRMビットが01に設定されていることを確認してください。
  • "round=nearest"オプションを選択している場合
    FPSCRのRMビットが00に設定されていることを確認してください。

適用製品

SuperHファミリ用C/C++コンパイラパッケージ
他にご質問がございましたら、リクエストを送信してください