如何检查2个浮点数是否相等(有一些给定的误差值)?

nul*_*ter 0 c floating-point floating-point-precision

我知道如何检查两个浮点数是否almost相等,简单代码:

bool compare(double a, double b)
{
    if(fabs(a - b) < (1.0 / 10000000))
        return true;
    else
        return false;
}
Run Code Online (Sandbox Code Playgroud)

但是当我有一些随机数据时,让我们说9.0和9.5,或者9.4我希望将它们视为相同数字,如何做到这一点?我的意思是,他们不相等,但我可以允许一些小错误+/- 0.5.有任何想法吗?

有了这个错误,我可以处理数字:

9.1 and 9.0 
3.1 and 3.6
-4.2 and -4.6
Run Code Online (Sandbox Code Playgroud)

平等的

Eri*_*hil 6

如果不知道这些数字中可能存在哪些计算错误以及应用目的可接受的是什么,则不可能知道使用什么容差来接受不等的数字.

一些简单的算术运算可能会产生无限错误,并且数百万算术运算也可能产生没有错误的结果.计算可能发生的错误必须单独进行计算; 没有一般规则.对于可接受的错误类型甚至没有一般规则:某些计算会导致与结果成比例的错误(相对错误),有些导致错误是绝对错误,有些导致错误是复杂的功能可能不会出现在被检查值中的数据.因此,即使是在给定误差量参数的情况下与相对误差进行比较的例程也不足以供一般使用.

另外,接受不相等的数字等于减少假阴性(如果使用精确数学计算的数字相等的情况是不相等的,因为使用了近似算术),代价是增加误报(接受数字相等,即使它们实际上是不相等的).一些应用程序可以容忍这一点.有些人不能.

如果您需要更多指导,您需要进一步解释您正在做什么以及您的目标是什么.

  • @nullpointer:你用C标记了这个问题,而不是Java.但是,Java的代码大致相同.最终,您的统计测试可能归结为将两个数字("fabs(ab)")的差异与某个阈值进行比较.但是,确定阈值是一个复杂的问题.您需要有一些过程的数学模型,一些值的变化量度(可能是从样本估计的标准偏差),以及您认为可接受的一些概率阈值,然后您必须计算一个阈值. (3认同)
  • @nullpoint:我认为你得到的是你有一些物理/现实世界过程的样本,你想测试这个过程的某些方面的意思是否不变.如果是这样,那就是统计测试,而不是浮点测试. (2认同)

ely*_*hiv 5

如果我理解你,这段代码将会:

bool compare(double a, double b, double precision)
{
    if(fabs(a - b) < precision)
        return true;
    else
        return false;
}
Run Code Online (Sandbox Code Playgroud)

  • 你忘了在`(1.0/2)`周围的大括号(对于不太熟悉宏替换的人来说,非宏版本会更容易) (4认同)
  • 函数签名中的语法`double precision = Mprecision`是什么意思?(这*是*C,对吧?) (2认同)