地板浮点模数

时间:2016-01-08 22:23:58

标签: c

我想创建一个类模数函数,可以使用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

1 个答案:

答案 0 :(得分:0)

如果你担心分支,那么可能这可能会更好,如果将整数加载到fpu中更便宜:

x += max * (x < 0);