如何获取浮点数之间的正模数

问题描述 投票:0回答:1

我有一个实数 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
。为什么以及如何让它按我想要的方式工作?

c++ modulo
1个回答
8
投票

编辑:感谢 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.