我有一个实数 x,我想得到数字
(x mod 2*PI) = y
,其中 y
介于 0 和 2*PI
之间。
我可以用循环来完成,如果
x
是负数,我只需继续添加2*pi
,直到我的数字在[0,2*pi]
范围内,或者如果x大于2*pi
,我可以继续减去。不过,我希望有一种更优雅的方法来做到这一点。
我试过这个:
fmod(-0.3434073,2*M_PI);
但这仍然是
-0.3434073
。为什么以及如何让它按我想要的方式工作?
编辑:感谢 Notinlist 更快地回答。
在C99标准中,第7.12.10.1节有这样的说法:
fmod 函数返回值 x − ny,对于某个整数 n,如果 y 不为零,则结果与 x 具有相同的符号,并且幅度小于 y 的幅度。如果 y 为零,则是否发生域错误或 fmod 函数返回零由实现定义。
按照这个,如果你想要正确的符号,你需要添加 y。
总而言之:
double fmod_positive(double x, double y){
double tmp = fmod(x, y);
return x < 0 ? tmp + y : tmp;
}