c++ - 精确为零的 float / double 相等

标签 c++ floating-point

我有一个算法,它使用 floatsdoubles 来执行一些计算。

例子:

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'"; 够了吗?

最佳答案

这取决于ba 是如何获得它们的值的。零在浮点格式中有精确的表示,但更大的问题是几乎但不完全为零的值。检查总是安全的:

if (abs(b-a) > 0.00000001  && ...

其中 0.00000001 是任何有意义的值。

关于c++ - 精确为零的 float / double 相等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9542391/

相关文章:

c++ - 模板重构

c++ - 如何判断输入的数字是否平衡?

c++ - 在 dll 中使用 std::list 无法解析的外部符号

math - float 学坏了吗?

javascript - 将 4 个 8 位无符号整数打包为 32 位 float

c++ - 在哪里声明这个记录器对象?

c++ - C++无法解析的外部函数,编译错误和带有字符串的数组

go - 将 []byte 数组(java 双编码)转换为 Float64

从二进制转换为 float

c++ - 在 C++ 中检查 double 是否为 2 的幂而无需位操作的代码