C++ 比较c+中的两个浮点/双精度浮点+;

C++ 比较c+中的两个浮点/双精度浮点+;,c++,C++,我读到应该使用一个区间(由一些ε给出)来实现float/double相等: bool arame(双a双b) { 返回值(fabs(a-b)

我读到应该使用一个区间(由一些ε给出)来实现float/double相等:

bool arame(双a双b)
{
返回值(fabs(a-b)

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

关于这一点已经有很多问题,但ε值取决于比较的值。由于浮点数具有一定数量的精确数字,因此在1E19附近进行比较与在1E-19附近进行比较是非常不同的。你不能用同一个ε来表示这些,因为精确度不够


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

我建议您多读一些关于比较浮动的书,这将是一个好主意。 这是一篇很好的文章,是我发现的一个快速示例

。 我相信还有很多。
关于您的问题,您可以在(float.h)中检查以下常量

FLT_ε
DBL_ε

LDBL_EPSILON

以及如何在给定数字范围的情况下准确确定EPSILON值,例如:如果数字为0.03和0.05?通过确定比较数字所在的区域并确定“相等”的含义。双精度约为15位小数,因此如果数字在1E19左右,则ε必须在1E5左右或更高(不是一个精确值!)才有可能大于差。@JohnLui这是相当随意的,真的。您可以执行类似(A+B)*0.00000001的操作。这个数字后面没有科学或数学,但这是可行的。或者,如果您知道要检查的上下文中的预期数字范围,则可以使用该范围。假设你的浮动是英里的x y坐标,你正在比较两个位置是否相同。。。如果它们相差<0.01英里(~50英尺),它们可能是相同的。虽然我相信有一个合适的方法可以解决这个问题,但只要考虑一下上下文,你可能会得到更好的结果。这是一个误解“总是会导致错误”。例如,浮点值与整数值总是可以进行精确比较。为了避免记忆大量关于这个问题的任意规则,请创建一个浮点数的心理模型,将其表示为整数乘以2的幂,然后推理出其中的大部分。你可能是指
fabs
,而不是
fmod
@cheers-sandhth.-Alf“浮点数与整数值总是可以精确比较”-一般来说,在舍入误差具有误导性的情况下,由于超过阈值后,只能对每秒钟一个整数,然后每四分之一个整数等进行编码,因此,例如
a+(b+c)
可能不等于
(a+b)+c
,尽管所有整数都是整数。我就不在这里了,“这本书读得不错。@TonyD:是的,它可能是一个更精确的陈述。”。除了你所说的树状结构之外,这些值不再是整数。要知道一个值是整数,必须知道该值的计算历史。这就是为什么我建议建立一个良好的思维模式。这样的信息就不再那么随意了(希望如此)。
bool aresame(double a, double b)
{
    return (fabs(a-b) < EPSILON);
}