我需要在C ++中使用模数

时间:2013-11-23 00:46:26

标签: c++

我有一个实数x,我想得到数字(x mod 2 * PI)= y,其中y介于0和2 *之间。

我可以用循环来做,如果x是负的,我只是继续加2 * pi,直到我的数字在[0,2 * pi]的范围内,或者如果x大于2 * pi,我可以继续减去。但是,我希望有一种更优雅的方式来做到这一点。

我试过了:

fmod(-0.3434073,2*M_PI);

但这仍然是-0.3434073。为什么以及如何让它按照我的意愿运作?

1 个答案:

答案 0 :(得分:8)

编辑:归功于Notinlist以便更快地回答。

在C99标准中,第7.12.10.1节有这样的说法:

对于某些整数n,fmod函数返回值x-ny,使得如果y非零,则结果具有与x相同的符号,并且幅度小于y的幅度。如果y为零,则是否发生域错误或fmod函数返回零是实现定义的。

如果你想要正确的标志,你需要添加 y

总而言之:

double fmod_positive(double x, double y){
    double tmp = fmod(x, y);
    return x < 0 ? tmp + y : tmp;
}