我有一个使用的算法floats
or doubles
执行一些计算。
Example:
double a;
double b;
double c;
...
double result = c / (b - a);
if ((result > 0) && (result < small_number))
{
// result is relevant...
} else {
// result not required...
}
现在,我担心的是(b - a)
可能为零。如果它接近零但不为零,则没关系,因为result
将超出有用的范围,并且我已经检测到这一点(如(b - a)
趋近于零,result
将接近 +/- inf,这不在范围内0
-small_number
...)
但如果结果是(b - a)
正好为零,我预计由于除以零,会发生一些依赖于平台的事情。我可以改变if
声明至:
if ((!((b-a) == 0.0)) && ((result = c/(b-a)) > 0) && (result < small_number)) {
但我不知道是否(b-a) == 0.0
将始终检测到与零相等。我已经看到浮点数中有多种精确零的表示形式?如何在不进行一些 epsilon 检查的情况下对它们进行测试,而我不需要这些 epsilon 检查(在我的算法中将忽略一个小的 epsilon)?
独立于平台的检查方式是什么?
EDIT:
不确定人们是否足够清楚。基本上我想知道如何查找类似以下的表达式:
double result = numerator / denominator;
将导致浮点异常、CPU 异常、来自操作系统的信号或其他......而不实际执行操作并查看它是否会“抛出”......因为检测到这种性质的“抛出”似乎很复杂并且特定于平台。
Is ( (denominator==0.0) || (denominator==-0.0) ) ? "Will 'throw'" : "Won't 'throw'";
enough?