我有一个算法,它使用 floats
或 doubles
来执行一些计算。
例子:
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
是否总是检测到等于零。我已经看到 float 中有多种精确零的表示形式?如果不进行一些我不需要的 epsilon 检查(小的 epsilon 将在我的算法中被忽略),你怎么能测试它们?
独立于平台的检查方式是什么?
编辑:
不确定人们是否足够清楚。基本上我想知道如何查找是否像这样的表达式:
double result = numerator / denominator;
将导致浮点异常、cpu 异常、来自操作系统的信号或其他......没有实际执行操作并查看它是否会“抛出”......因为检测到“抛出”这种性质似乎很复杂且特定于平台。
( (denominator==0.0) || (denominator==-0.0) ) 是吗? "Will 'throw'": "Won't 'throw'";
够了吗?
最佳答案
这取决于b
和a
是如何获得它们的值的。零在浮点格式中有精确的表示,但更大的问题是几乎但不完全为零的值。检查总是安全的:
if (abs(b-a) > 0.00000001 && ...
其中 0.00000001 是任何有意义的值。
关于c++ - 精确为零的 float / double 相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9542391/