2013-11-23 67 views
1

我有一個實數x,我想得到數(x mod 2 * PI)= y,其中y在0和2 * PI之間。我需要模C++

我可以做一個循環,如果x是負數我只是不斷添加2 * pi直到我的數字在[0,2 * pi]的範圍內,或者如果x大於2 * pi我可以保留減法。不過,我希望有一個更優雅的方式來做到這一點。

我嘗試這樣做:

fmod(-0.3434073,2*M_PI); 

,但是這仍然-0.3434073。爲什麼以及如何才能讓它按照我的意願工作?

+5

創造條件。如果輸入是負數,那麼2 * M_PI必須添加到它之後。 – Notinlist

+0

你是否需要模π的雙倍表示,或者兩次模數數2π?在第二種情況下,它要複雜得多,查找「減少參數」或查看http://port70.net/~nsz/musl/clang-2013-10-04/report-00117a的實例。 html。即使在第一種情況下,反覆加或減會導致舍入誤差大於所需。 –

回答

8

編輯:點數Notinlist更快地回答。

在C99標準,部分7.12.10.1有這樣說:

的FMOD函數返回值x - NY,對於某些整數n,使得,如果y爲非零值,結果具有相同的標記爲x並且小於y的大小。如果y爲零,則發生域錯誤還是fmod函數返回零是由實現定義的。

要做到這一點,你需要添加如果你想要正確的標誌。

總而言之:

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