什么操作可以使浮点数离开 [0, 1] 范围?

Jan*_*tke 7 c++ floating-point precision ieee-754

我经常使用[0, 1] 范围内的floatdouble类型。我知道浮点运算是不精确的,所以我通常会限制我的值,以便在运算之前/之后保证它们在这个范围内。

在某些情况下,我依赖浮点数甚至不是轻微的负值,而是完全是<= 1,因此这是必要的。

例如,在这些功能中的任何一个中是否有必要:

// x and y are guaranteed to be in [0, 1]
float avg(float x, float y) {
    // the average of [0, 1] values should always be in [0, 1]
    return std::clamp<float>((x + y) / 2, 0, 1);
}

float mul(float x, float y) {
    // the product of [0, 1] values should always be in [0, 1]
    return std::clamp<float>(x * y, 0, 1);
}

float pow(float x, unsigned y) {
    // raising an [0, 1] value to any unsigned power should also result in an [0, 1] value
    return std::clamp<float>(std::pow(x, y), 0, 1);
}
Run Code Online (Sandbox Code Playgroud)

算术运算何时可以使浮点数离开 [0, 1] 范围,是否有任何一致的规则?

Bat*_*eba 6

如果可以,请将此答案限制为 IEEE754。

0, 1, 和2都可以精确地表示为float。算术运算符需要返回可能的最佳浮点值。由于xy都不大于 1,因此它们的总和不能大于 2,否则float总和会更好。换句话说,两个float小于的和1不能大于2

这同样适用于产品。

第三个需要一个夹子,因为不能保证std::pow(x, y)返回最好的float

  • 我很确定 (a+b+c+...) 不能 &gt;N 对于 N 个数字 &lt;=1。我没有明确的证据。并且可能需要 N &lt; 2^24。 (2认同)