我想创建一个类模数函数,可以使用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
答案 0 :(得分:0)
如果你担心分支,那么可能这可能会更好,如果将整数加载到fpu中更便宜:
x += max * (x < 0);