我想创建一个类模函数,它可以使用 double
精度浮点数而不是 int
。另一个重要因素是函数必须向负无穷大而不是零舍入。
我有几个有效的方法,但我认为它们对于将在循环中多次调用的函数来说很慢:
// A suggested method
double reduce_range(double x, const double max) {
x /= max; // Normalize to [0,1)
x -= (int) x;
x += 1.0;
x -= (int) x;
return x * max; // Denormalize
}
// My own simple implementation
double reduce_range(const double x, const double max) {
return x - floor(x / max) * max;
}
两者似乎都有效,但第二个使用 floor
(这似乎是这类事情的瓶颈),第一个重复转换为 int 和减法。有没有更快的方法来执行此操作(或允许编译器处理它)?
或者,这个怎么样:
double reduce_range(double x, const double max) {
x = fmod(x, max);
if(x < 0) x += max;
return x;
}
分支 if
会大大降低速度吗?
编辑:一些示例输入和输出:
(5.0, 7.0) >> 5.0
(8.5, 7.0) >> 1.5
(-2.3, 7.0) >> 4.7
如果您担心分支,那么如果将整数加载到 fpu 中更便宜的话,这可能会更好:
x += max * (x < 0);
我是一名优秀的程序员,十分优秀!