Jan*_*tke 7 c++ floating-point precision ieee-754
我经常使用[0, 1] 范围内的float
或double
类型。我知道浮点运算是不精确的,所以我通常会限制我的值,以便在运算之前/之后保证它们在这个范围内。
在某些情况下,我依赖浮点数甚至不是轻微的负值,而是完全是<= 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] 范围,是否有任何一致的规则?
如果可以,请将此答案限制为 IEEE754。
0
, 1
, 和2
都可以精确地表示为float
。算术运算符需要返回可能的最佳浮点值。由于x
和y
都不大于 1,因此它们的总和不能大于 2,否则float
总和会更好。换句话说,两个float
小于的和1
不能大于2
。
这同样适用于产品。
第三个需要一个夹子,因为不能保证std::pow(x, y)
返回最好的float
。
归档时间: |
|
查看次数: |
145 次 |
最近记录: |