bec*_*cko 8 c++ floating-point operator-overloading comparison-operators
我数学,x <= y相当于!(x > y).在大多数情况下,这适用于浮点运算,但并非总是如此.当x或者y是NaN,x <= y是不是等同于!(x > y),因为比较一个NaN任何事情总是返回false.但是,x <= y <=> !(x > y)大部分时间都是如此.
现在,假设我正在编写一个包含浮点值的类,我想为这个类定义比较运算符.为了明确,假设我正在编写一个高精度浮点数,它在double内部使用一个或多个值来存储高精度数.在数学上,x < y这个类的定义已经定义了所有其他运算符(如果我与比较运算符的通常语义一致).但是,NaNs打破了这个数学上的精确性 所以也许我不得不分别编写许多这些运算符,只是为了考虑NaNs.但有更好的方法吗?我的问题是:如何尽可能避免代码重复并仍然尊重行为NaN?
相关:http://www.boost.org/doc/libs/1_59_0/libs/utility/operators.htm.boost /运营商如何解决此问题?
注意:我标记了这个问题,c++因为这是我理解的.请用该语言编写示例.
当您定义运算符<时,您需要处理 NaN 情况。出于排序和比较的目的,如果将 NaN 视为小于任何非 NaN,则可以执行以下操作:
bool operator<(double l, double r) {
if (isnan(l)) {
if (isnan(r)) return false; // NaN == NaN
return true; // NaN < rational
}
return l < r; // if r is NaN will return false, which is how we've defined it
}
Run Code Online (Sandbox Code Playgroud)
其他运算符根据operator< 定义,不需要手动编写代码。