お世話になっております。
みゅうと申します。
SH7211上で動作していたプログラムを、SH7216上へと移植しているのですが、
演算の結果が同一にならず困っております。
厳密には8.333332500となるようなfloat値、8.333332①に対して×1000000②をすると
両CPU上で、共に8333333となります。(切り上げor制約?)
これに対して、元に戻す演算である、÷1000000をすると③
7211上では、8.333332になり(まるめ指定省略=round-nearest?)、
7216上では、8.333331になります(round-nearest指定)。
該当部のソースコードは以下です。
p->acc_par_spd_par_2 = (float) p->accele / speed / 2; p_par2 = p->acc_par_spd_par_2; //① ※左辺右辺共にfloat型です p->acc_par_spd_par_2 *= (float) 1000000; //② par2 = p->acc_par_spd_par_2 / 1000000; //③ ※同上
また、SH7216において上記コード部によって算出した①③がそろっているように見えても、
実際には内部表現が異なる場合があります。
floatでは有効桁を超えた情報は欠落すると思っているのですが、
大小比較において真となります。
これらについて、詳細をご教授いただければと思います。よろしくお願いします。
SH7216 の FPU なし版が SH7214 であり、開発ツールのマイコンの設定をそれにすれば SH7216 で FPU を使用しない動作は可能かもしれません。細かい仕様の差異がないかはよく確認する必要があります。 他、浮動小数点演算の演算誤差に影響するコンパイラオプションは存在するので SH7211 のプログラムを作成した際の設定は SH7216 でも同様にする必要があります。コンパイラの版についても同様です。