gpt4 book ai didi

c++ - 使用 Catch2 以全精度打印浮点值

转载 作者:行者123 更新时间:2023-12-01 14:18:44 29 4
gpt4 key购买 nike

我有一些使用 的测试代码,它会检查某些计算是否返回浮点空值。

CHECK( someFunc() == 0. );

问题是,当测试由于非常小的非空值(比如 1.234E-16)而失败时,这些值会以“默认”打印方式打印,我看到:
my_test.cpp:351: FAILED:
CHECK( someFunc() == 0.0 )
with expansion:
0.0 == 0.0

这几乎没用。我想看到的是:
my_test.cpp:351: FAILED:
CHECK( someFunc() == 0.0 )
with expansion:
1.234E-16 == 0.0

我试过直播 std::scientificstd::cout就在测试之前,但显然 Catch 使用另一种打印方法。

任何的想法 ?

旁注:实际上,我使用提供的 Approx 课,但这与我的问题无关

编辑 : 这里的问题是 不是 关于比较本身(我知道浮点值的所有邪恶之处),它是 只有关于如何告诉 Catch 打印处理的值。

最佳答案

更新 : 你can now specify precision in Catch2 .以下内容适用于旧版本的 Catch2。

看起来精度是在 Catch2 本身中硬编码的:

std::string StringMaker<float>::convert(float value) {
return fpToString(value, 5) + 'f';
}
std::string StringMaker<double>::convert(double value) {
return fpToString(value, 10);
}

有两个选项可以解决这个问题:

选项 1:修改 Catch2

如果你修改它,你可以让它显示你想要的(注意: <limits> 已经包含在 catch 中,所以我将使用 std::numeric_limits ):

std::string StringMaker<float>::convert(float value) {
return fpToString(value, std::numeric_limits<float>::max_digits10) + 'f';
}
std::string StringMaker<double>::convert(double value) {
return fpToString(value, std::numeric_limits<double>::max_digits10);
}

可以采用更复杂的方法将其设置为用户可以设置的参数,而不是将其硬编码为不同的半任意值,但这只是问答,而不是拉取请求。 ;-)

选项 2:以更高的精度自行登录

如果您添加 INFO( FullPrecision(d) );之前 REQUIRE()调用,你会得到一个完整的精度打印,但只有当测试用例失败时。 (请参阅下面 FullPrecision() 的定义。)

此处演示了这两种更改:

#define CATCH_CONFIG_MAIN  // This tells Catch to provide a main() - only do this in one cpp file
#include "catch.hpp"
#include <limits>
#include <sstream>
#include <iomanip>

double GetDouble() { return std::numeric_limits<double>::epsilon(); }

std::string FullPrecision( double d )
{
auto s = std::ostringstream{};
s << std::setprecision( std::numeric_limits<double>::max_digits10 ) << d;
return s.str();
}

TEST_CASE( "Double, double, toil and trouble", "[double]" )
{
const auto d = GetDouble();
INFO( FullPrecision(d) );
REQUIRE( 0.0 == d );
}

打印:
prog.cc:20: FAILED:
REQUIRE( 0.0 == d )
with expansion:
0.0 == 0.00000000000000022
with message:
2.2204460492503131e-16

修改 Catch2 导致扩展 0.0 == 0.00000000000000022 ,并添加 INFO()导致消息 2.2204460492503131e-16 .

现场观看 Wandbox .

关于c++ - 使用 Catch2 以全精度打印浮点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55867570/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com