我有几种情况需要将浮点数钳位到任意[1]范围的上端或下端。到目前为止,我一直在使用floor
和ceil
函数进行前缩放和后缩放:
y*floor(x/y) - x + y
y*ceil(x/y) - x - y
y
的位置指定了我们要捕捉到的范围的大小。这行得通,但感觉不佳,而且这些计算经常发生,足以成为实际的性能瓶颈。现在,事实证明x mod y = x - y*floor(x/y)
(这意味着只需一点代数就可以将第一个表达式简化为y - (x mod y)
,这是两个操作而不是五个操作,并且消除了乘法)。
但是,我在解决如何不使用分支的情况下替换ceil
方面遇到了更大的困难(这对性能没有任何好处)。因此,是否有任何方法可以重写y*Math.ceil(x/y)
从而给我简化代数的机会,还是我只能坚持这样做?
[1]如果有帮助,y
始终是2的整数次幂,并且该指数已缓存并可以使用。