比较c ++中的两个浮点数/双精度数[重复]

Posted

技术标签:

【中文标题】比较c ++中的两个浮点数/双精度数[重复]【英文标题】:Comparing two floats/doubles in c++ [duplicate] 【发布时间】:2015-10-22 16:33:45 【问题描述】:

我读到浮点数/双精度数相等应该使用一个间隔来实现(由一些 epsilon 给出):

bool aresame(double a, double b)

    return (fabs(a-b) < EPSILON);

我可以使用它们的任何预定义 EPSILON 值还是我必须自己定义它,例如0.0000000001

【问题讨论】:

这是一种“总会导致错误”的误解。例如,浮点值与整数值总是可以精确比较。为避免不得不记住无数看起来随意的规则,请创建一个浮点数的心智模型,将其作为整数乘以 2 的幂,并将其中大部分推理出来。 你的意思可能是fabs,而不是fmod @Cheersandhth.-Alf “浮点值与整数值始终可以精确比较” - 作为一般性陈述,并且在舍入误差的情况下会产生误导,就像过去一样一个阈值只有每隔一个整数,然后每隔四个等可以被编码,所以例如a + (b + c) 可能不等于 (a + b) + c,尽管它们都是整数。 我将把this link to a Blog留在这里,它是一个很好的阅读。 @TonyD:是的,这可能是一个更准确的说法。超出您所说的门槛,这些价值观不再是不可或缺的。并且要知道一个值是整数,必须知道该值的计算历史。这就是为什么我建议对事物有一个好的心理模型。那么这样的信息似乎不再那么随意了(希望如此)。 【参考方案1】:

我建议你多阅读一些关于比较浮点数的内容。 这是一篇很好的文章,作为我发现的一个快速示例。

Here is a link to updated article。 我相信还有更多。 关于您的问题,您可以在 (float.h) 中检查以下常量

FLT_EPSILON DBL_EPSILON LDBL_EPSILON

【讨论】:

【参考方案2】:

这方面已经有很多问题了,但是 epsilon 值取决于所比较的值。由于浮点数具有一定数量的准确数字,因此在 1E19 附近进行比较与 1E-19 进行比较是非常不同的。您不能对它们使用相同的 epsilon,因为精度不够。

因此,您必须知道数字的范围并相应地确定 epsilon 值。

【讨论】:

在给定数字范围的情况下,如何准确确定 EPSILON 值,例如:如果数字是 0.03 和 0.05? 通过确定比较数字所在的区域并确定“相等”的含义。双精度数大约有 15 位小数,所以如果数字在 1E19 左右,那么您的 epsilon 必须在 1E5 左右或更高(不是精确值!),甚至有可能大于差异。 @JohnLui 真的很随意。您可以执行 (A + B) * 0.00000001 之类的操作。这个数字背后没有科学或数学,但它会起作用。或者,如果您知道要检查的上下文中的预期数字范围,则可以使用它。假设您的浮动是英里的 x y 坐标,并且您正在比较两个位置是否相同......如果它们的差异

以上是关于比较c ++中的两个浮点数/双精度数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C语言中单双精度数表示啥意思?

php随机浮点数都有哪些?比如从0.1到3.0中随机一个浮点数出来?

如何正确地将作为 CSV 文件中字符串的浮点数/双精度数作为浮点数/双精度数导入程序?

使用浮点数和双精度时,c 中的 -0.0000 是啥?

访问“错误地”比较浮点数

给出公差比较列表中的浮点数[重复]