我想我发现了为什么会发生这种情况,但我不知道如何让它在 Catch 中工作。
这个:
#include <iostream>
#include <limits>
#include <iomanip>
int main()
{
double a = 1147332687.7189338;
double b = 1147332688.4281545;
float c = 1147332687.7189338;
float d = 1147332688.4281545;
std::cout << std::setprecision(std::numeric_limits<decltype(a)>::max_digits10) << a << std::endl;
std::cout << std::setprecision(std::numeric_limits<decltype(b)>::max_digits10) << b << std::endl;
std::cout << std::setprecision(std::numeric_limits<decltype(c)>::max_digits10) << c << std::endl;
std::cout << std::setprecision(std::numeric_limits<decltype(d)>::max_digits10) << d << std::endl;
}
输出这个:
1147332687.7189338
1147332688.4281545
1.14733274e+09
1.14733274e+09
很明显,浮点数不足以区分这些数字,但双精度数可以。似乎 Catch 在内部使用了浮点数;即使我试图强迫它使用双打,测试也通过了。但也许我错过了什么?
TEST_CASE("Test1")
{
double d1 = 1147332687.7189338;
double d2 = 1147332688.4281545;
REQUIRE(d1 == Approx(d2));
}
所以没有解决办法,但至少你现在知道为什么会得到这些奇怪的结果。