【发布时间】:2014-07-05 00:38:14
【问题描述】:
我有一个返回双精度值的函数。在某些情况下,结果为零,因此应在调用者路由中相应地处理此结果。我想知道返回零(NaN、false 等!)代替双值数字的正确方法是什么:
double foo(){
if (some_conditions) {
return result_of_calculations;
} else {
// Which of the following is better?
return std::numeric_limits<double>::quiet_NaN(); // (1)
return 0; // (2)
return false; // (3)
return (int) 0; // (4)
}
}
调用例程是这样的:
double bar = foo();
if (bar == 0) {
// handle the zero case
} else {
// handle the non-zero case
}
if (bar == 0) 与#3 和#4 一起使用是否安全?我可以将它与#2 一起使用,还是应该执行fabs(bar - 0) < EPSILON 之类的操作?
quiet_NaN的情况应该如何处理?我在这个网站(例如1、2)中读到,NaN 的比较不是总是错误的。那该怎么办?
总之,如何返回一个假值来代替双精度值以供以后比较?
【问题讨论】:
-
请注意,返回 0 的所有三种方式都会向调用者返回相同的 double,因此您的问题归结为“0 vs. NaN”,然后问题是 0 是否是有效的返回值.如果是,你可能想看看 boost::optional
-
@PlasmaHH,我明白你的意思。
boost然而,恐怕是不可能的。我正在寻找一种纯 c++ 方法。 -
上次我检查 boost 是一个库可以得到的纯 C++...
-
@PlasmaHH:我认为 OP 实际上意味着不使用任何第三方库,而只使用 stdlib。
-
如果零情况是异常行为,则抛出异常并让 bar 或其他任何人处理它。但是,如果零案例是预期的正常行为的结果,请不要这样做,而只是应该处理的单独案例。
标签: c++ nan logical-operators double-precision