- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我经常使用 Boost.Test 来测试数值。我经常需要比较数学对象的值。下面是一个玩具示例,展示了我如何进行大量测试。
#define BOOST_TEST_MODULE VektorTest
#include <boost/test/included/unit_test.hpp>
#include <boost/test/floating_point_comparison.hpp>
struct Vector {
Vector(double x, double y, double z) : x(x), y(y), z(z) {}
double x;
double y;
double z;
};
BOOST_AUTO_TEST_CASE(Rotations, * boost::unit_test::tolerance(1.0e-2)) {
Vector vector1(1.5,3.,7.4);
Vector vector2(1.51, 3.01, 7.41);
// The following can get really annoying and is error prone.
BOOST_TEST(vector1.x==vector2.x);
BOOST_TEST(vector1.y==vector2.y);
BOOST_TEST(vector1.z==vector2.z);
// This should be the expected usage, but only if the tolerance is considered.
// BOOST_TEST(vector1==vector2); // Will not compile!
}
我可以教 Boost.Test 识别考虑 boost::unit_test::tolerance
的自定义类型吗?装潢师?
单纯的一对一内容比较x,y,z
的 Vector
object 将不是可行的解决方案。
#define BOOST_TEST_MODULE VektorTest #包括 #包括
结构 vector { vector (双 x、双 y、双 z):x(x)、y(y)、z(z){}
double x;
double y;
double z;
};
编辑
在仔细研究了 Boost.Test 的文档之后,我发现了有趣的函数 per_element()
, 这允许比较序列中包含的值。这个功能已经是一个很大的好处,因为它考虑了 tolerance
装饰器,如下所示。一个std::vector<T>
满足序列接口(interface),可以很好地在这个框架内使用。
Boost.Test 文档说,一个序列应该实现 size()
和 begin()
函数,以及字段 const_iterator
和 value_type
.对于我来说,这不是一个可行的解决方案,因为我无法更改数学类的接口(interface)。更重要的是,我无法扩展下面的玩具示例来满足这个接口(interface)。
#define BOOST_TEST_MODULE VektorTest
#include <boost/test/included/unit_test.hpp>
#include <boost/test/floating_point_comparison.hpp>
struct Vector {
Vector(double x, double y, double z) : x(x), y(y), z(z) {}
double x;
double y;
double z;
};
BOOST_AUTO_TEST_CASE(VectorTest, * boost::unit_test::tolerance(1.0e-4)) {
{
std::vector<double> vector1;
vector1.push_back(1.5);
vector1.push_back(3.);
vector1.push_back(7.4);
std::vector<double> vector2;
vector2.push_back(1.51);
vector2.push_back(3.01);
vector2.push_back(7.41);
BOOST_TEST(vector1==vector2, boost::test_tools::per_element());
}
{
Vector vector1(1.5,3.,7.4);
Vector vector2(1.51, 3.01, 7.41);
//BOOST_TEST(vector1==vector2, boost::test_tools::per_element()); // Will not compile!!!
}
}
最佳答案
我不确定是否完全理解您的问题,但也许 BOOST_TEST_SPECIALIZED_COLLECTION_COMPARE
(参见 here )是您问题的答案。
如果你想考虑你的 Vektor
作为应执行基于公差的比较的类型,那么您可能会查看 here在文档中
你需要的是:
EqualityComparable
, LessThanComparable
)。所有比较(参见 here 和 there )操作都涉及要计算的两个值之间的差异,因此您需要您的类来实现 LessThanComparable
,否定 - 绝对值 - 和从单一值构造 - 原点所需 - 。 boost.operators
在这里可能会有很好的帮助。 tolerance_based
的特化来通知 boost.test 您的类与基于公差的操作兼容为你的类(class)在您的情况下,您想要实现的公差区域位于特定位置周围的 3D 立方体内。给定公差\epsilon,
所有这些操作都是由 close_at_tolerance 执行的.
因为你想执行每个轴的公差,你可以实现
operator-
作为每个轴的差异operator-
(一元否定)作为每个轴的否定operator<
作为每个轴的比较operator/
作为每个轴的划分等operator<
和 operator-
(一元)用于计算绝对值。
但是,这不会像预期的那样工作 std::max
和 std::min
也应该实现(参见 here )。在您的情况下,他们应该提供 max
和 min
每个轴。目前
close_at_tolerance
的特化(参见 here)。std::min
和 std::max
并专注于boost::math::fpc::fpc_detail::fpt_abs
(私有(private) API)用于计算绝对值。归根结底,这只是比较的问题。公差、差异和绝对值计算。
如果你拿走
|v1 - v2| = (|a1-a2|, |b1-b2|, |c1-c2|)
|v1 - v2|/|v1| = (|a1-a2|/|a1|, |b1-b2|/|b1|, |c1-c2|/|c1|) // same for v2
max(|v1 - v2|/|v1|, |v1 - v2|/|v2|) = (max(|a1-a2|/|a1|, |a1-a2|/|a2|),
max(|b1-b2|/|b1|, |b1-b2|/|b2|),
... )
执行测试需要的是:
|v1 - v2|/|v1| < eps. && |v1 - v2|/|v2| < eps.
=> max(|v1 - v2|/|v1|, |v1 - v2|/|v2|) < eps.
=> max(|v1 - v2|/|v1|, |v1 - v2|/|v2|) < vektor(eps., eps., eps.)
=> max(|a1-a2|/|a1|, |a1-a2|/|a2|) < eps.
&& max(|b1-b2|/|b1|, |b1-b2|/|b2|) < eps. ...
并且它与每轴的最大值、除法和比较一致。
关于c++ - Boost.Test 自定义类型使用装饰器 boost::unit_test::tolerance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35623727/
我更新了kube-apiserver服务,默认容限为60秒。 --default-unreachable-toleration-seconds=60 --default-not-ready-toler
我有以下步骤: return stepBuilderFactory.get("billStep") .allowStartIfComplete(true)
我想为以下查询添加某种“容差”。这意味着,我可以指定一个值来表示四个(子)选择中有多少返回行 > 0。因此,如果该值为 2,我只想连接这两个表。有没有办法实现这一点? SELECT distinct(
我有这个 df : FRAME TRACK_ID SUM TC_17 1 15 0 1 2 15 0 1 3
@Tolerate注释是 lombok 中的一项实验性功能其中目标类型是方法或构造函数。 Lombok website提到: Any method or constructor can be anno
我有一个带有 float 字段的类。例如: public class MultipleFields { final int count; final float floatValue;
有人知道 JSLint 的“容忍愚蠢”选项是什么意思吗?它会禁用哪些警告系列? 我找到了一些关于 Node.js 和“Sync”方法的引用资料(包括 Crockford 的评论“它的名字非常好”),但
出于学习原因,我正在使用 scikit-learn 界面创建自定义分类器。所以,我想出了以下代码: import numpy as np from sklearn.utils.estimator_ch
HP NonStop 系统(以前称为“Tandem”)以其高可用性和可靠性以及更高的价格而闻名。 在这些方面和其他方面,基于 Linux 或 Unix 的集群与它们相比如何? 最佳答案 在容错机器上,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
我整合了许多有用的答案,并提出了我自己的 answer below 例如,我正在编写一个 API Foo这需要显式初始化和终止。 (应该与语言无关,但我在这里使用 C++) class Foo { p
据我从维基百科和令人难以置信的 HPE 网站收集到的信息,NonStop 系统架构的名声在于它可以实现单一故障 FT,而无需分配过多的备用容量(即在锁步架构中您通常需要 3 倍的超额配置)。 这似乎是
我经常使用 Boost.Test 来测试数值。我经常需要比较数学对象的值。下面是一个玩具示例,展示了我如何进行大量测试。 #define BOOST_TEST_MODULE VektorTest #i
[class.derived]的第一段说的是基类说明符, If the name found is not a class-name, the program is ill-formed. 但是,一个
在解析 Kaitai Struct 中的截断日志时,有什么方法可以传递一些字段吗?因为如果它读取一个字段(类型指定为枚举)但值不在其中,它将引发 NullPointer Exception。 所以我想
根据scikit-learn SGDClassifier documentation ,修改后的 Huber 损失函数可用于对异常值提供更高的容忍度。 看看 plot虽然是成本函数的一部分,但 Mod
我使用JSLint ST 插件(除了 SublimeLinter-jshint 插件)。 我不同意使用 ++ 或 -- 是邪恶的、棘手的等理论,并且可以非常自由地使用它们。因此,我不喜欢在整个代码中
我是 Kubernetes 的新手,并且遇到了一些错误。我想在我的本地系统(mac)上创建 Kubernetes 集群。 我的部署.yaml -- apiVersion: apps/v1 kind:
我无法找出导致应用程序在退出时崩溃的原因。更让人困惑的是,它并不总是崩溃,有时会崩溃,有时不会,而且它似乎完全是任意的。 该示例基本上创建了一个自定义图像提供程序,该提供程序将静态谷歌地图 API 请
在 xgb.cv 函数(来自库 xgboost)中,其中一个选项是 early_stopping_rounds。这个选项的描述是: 如果为 NULL,则不触发提前停止功能。如果设置为整数 k,如果性能
我是一名优秀的程序员,十分优秀!