DBL_EPSILON/std::numeric_limits::epsilon 将为我提供与加一时产生差异的最小值。
我无法理解如何将这些知识应用到有用的东西中。
epsilon 远大于计算机可以处理的最小值,因此使用比 epsilon 更小的值是安全的,这似乎是一个正确的假设?
我正在使用的值之间的比率是否应该小于 1/epsilon ?
DBL_EPSILON/std::numeric_limits::epsilon 将为我提供与加一时产生差异的最小值。
我无法理解如何将这些知识应用到有用的东西中。
epsilon 远大于计算机可以处理的最小值,因此使用比 epsilon 更小的值是安全的,这似乎是一个正确的假设?
我正在使用的值之间的比率是否应该小于 1/epsilon ?
DBL_EPSILON 的定义并非如此。它是 1 和 1 之后的下一个可表示数字之间的差异(您的定义假设舍入模式设置为“趋向 0”或“趋向负无穷大”,这并不总是正确的)。
如果您对数值分析有足够的了解,这将很有用。但我担心这个地方不是最好的了解这一点的地方。例如,您可以使用它来构建一个比较函数,该函数将判断两个浮点数是否近似相等,如下所示
bool approximatively_equal(double x, double y, int ulp)
{
return fabs(x-y) <= ulp*DBL_EPSILON*max(fabs(x), fabs(y));
}
(但不知道如何确定 ulp,你会迷路的;如果中间结果是非正规的,这个函数可能会出现问题;fp 计算很复杂,很难变得健壮)
X
与 的下一个值之间的差值X
根据 变化X
。
DBL_EPSILON
只是1
和 的下一个值之间的差1
。
您可以使用epsilon 差异std::nextafter
来测试两个:double
bool nearly_equal(double a, double b)
{
return std::nextafter(a, std::numeric_limits<double>::lowest()) <= b
&& std::nextafter(a, std::numeric_limits<double>::max()) >= b;
}
如果您想double
用 factor * epsilon 差异测试两个,您可以使用:
bool nearly_equal(double a, double b, int factor /* a factor of epsilon */)
{
double min_a = a - (a - std::nextafter(a, std::numeric_limits<double>::lowest())) * factor;
double max_a = a + (std::nextafter(a, std::numeric_limits<double>::max()) - a) * factor;
return min_a <= b && max_a >= b;
}