gtestでテスト対象モジュールで計算されたfloat値を正しく計算されたか、Execl計算値と照合するケースは多いのではないでしょうか? floatは32bitですが数値分解能は23bit(確か…)、longの方が精度が高く、実際にはあまり使わないものです。今時のPCや携帯端末では、doubleを多用してもへっちゃらです。
しかし、マイコン向け組込みソフトでは未だdoubleを多用できるほど処理能力がありません。MATLAB/simulink の自動コード生成の都合で float(single) は使う場合もあるようですが、そもそも浮動小数点数は自体あまり使うべきではないと考えますが…
とあるお客さまで、gcc 使用でfloat値 不一致が多発していたので少し調べてみました。調査は VC++2019 で行っています。
Execl計算値をそのまま照合した場合
Execl計算値をそのまま EXPECT_FLOAT_EQ に指定した場合、指定した数値から精度が落ちたことを警告されます。なるほどgccよりvc++の方が賢いみたいですね。テストはgccと異なり合格になります。Execl2003はVC++でBuildされてるでしょうから同じコンパイラから生成された数値は一致しやすいのでしょうか?
Execl計算値をVBAマクロでfloat化した場合
Execl計算生値では精度が大きすぎるようです。値をVBAマクロでfloat(Single)化した値をEXPECT_FLOAT_EQ に指定してみると、精度が落ち切っていないようです。
いっそEXPECT_DOUBLE_EQ を使ってみる
Execlに精度をあわせて EXPECT_DOUBLE_EQ を使うと上手くいくのでは? と思いましたが、float -> double 拡張で数値が変わってしまうようです。
ということて面倒ですが数値公差範囲を決めて、 EXPECT_NEAR を使しかなさそうです。EXPECT_FLOAT_EQ の公差は 4 ULPs (Unit of Last Place: 下4桁?) 以内にとのこと。