【发布时间】:2021-12-26 23:00:03
【问题描述】:
对于有限值v0、v1 和r 在[0, 1] 范围内的值v,计算如下,是否始终属于[v0, v1] 范围,或者它可以(稍微)由于四舍五入错误而超出?
double v0; // Finite
double v1; // Finite
double r; // In [0, 1]
double v = v0 * r + v1 * (1.0 - r);
if (v0 <= v1)
assert(v0 <= v && v <= v1);
else
assert(v1 <= v && v <= v0);
【问题讨论】:
-
当
v0、v1和r都设置为1./3.(使用IEEE-754 binary64)时,断言失败。 -
@EricPostpischil 是的,我会对
v0 != v1和 FTZ(将 denorms 刷新为 0)模式感兴趣... -
备注:如果还有疑问,可以使用std::clamp保证
v在区间内 -
没有
v0等于v1且远离次正规的情况是v0 = 7./13、v1 = 6./11和r = 0x1.5p-50。 -
@user2052436 即使
v0 != v1和所有涉及的数字都正常,断言也会失败。
标签: c++ c floating-point rounding