c++ - 如何有效地比较包含 double 的 std::tuple 是否相等

标签 c++ optimization c++11 floating-point

<分区>

我想尽可能高效地比较两个包含 double 的元组。

由于浮点精度,使用预定义的运算符==(...) 无法做到这一点,最好的方法是什么?我是否真的需要遍历所有元组元素,或者是否有一些我可以使用的模板魔术,这可能允许编译器调用一些 SIMD 优化?

最佳答案

认为比较浮点值的相等性会受到损害是一种误解。在任何没有严重损坏的实现中,当且仅当比较的值相等时,比较浮点值是否相等返回 true。

任何实际错误都存在于您计算的早期。必须控制和表征这些错误。如果不对错误进行表征,就不可能就适合您的目的的执行操作提出任何建议。

如果您的值计算不准确,因此它们可能包含一些错误,并且您希望接受实际上不相等的相等值,那么您必须说明 (a) 接受相等的标准,以及 (b ) 拒绝平等的标准。陈述了这些标准后,人们可能会为您提供有关实现满足这两个标准的测试的建议。请注意 (b) 和 (a) 一样重要,因为您通常不希望接受实际上不相等的值。由于您的计算存在错误,因此某些决定将是错误的,您必须确定标准 (a) 和 (b),以便您的应用可以接受不正确的决定。重要的是 (a) 和 (b) 不重叠,否则会出现无法接受任何决定的情况。

在您的情况下,除了从文件中读取数据外,您没有说明任何错误来源。如果文件中的数据是由优质软件编写的浮点计算结果(能够以足够的精度将浮点值正确转换为十进制数字),并且您使用优质软件读取它(能够将十进制数字正确转换为 float )点值),那么在这个数据往返过程中没有错误,你应该简单地测试是否相等,没有任何修饰。

关于c++ - 如何有效地比较包含 double 的 std::tuple 是否相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13603512/

相关文章:

java - 在类内部使用访问器方法?

c++ - 函数调用的成本是多少?

python - Numpy 规范化代码出奇地慢

c++ - 如何在成员函数上使用 std::async?

c++ - 有没有办法在编译时和运行时之间专门化一个函数?

C++11 堆栈分配与 Unique_Ptr

c++ - boost 功能的奇怪行为

C++ 转换和 lambda

c++ - move 语义和参数评估顺序

c++ - .inl 文件在 C++ 中的意义