這是我沒有想到的。我知道這些數字是不準確100%,但我沒想到餘角給人sin
不同的結果和cos
:爲什麼sin(45)和cos(45)給出不同的結果?
這下面的函數返回0.70710678118654746000000...
sin(45 * PI/180.0);
而這follwing函數返回0.70710678118654757000000...
cos(45 * PI/180.0);
所以,它的:
0.707106781186547**46**000000... vs
0.707106781186547**57**000000...
而不僅僅是... sin(1 * PI/180.0)
也返回比cos(89 * PI/180.0)
略有不同數量雖然他們應該是相同的。
而且這不僅是一個sin
VS cos
問題,它也是一個sin
VS sin
問題:sin(1 * PI/180.0)
比sin(179 * PI/180.0)
返回不同的值,他們又應該是相同的。
我試圖用弧度,而不是學位,並有完全一樣的區別,我試圖用一個小的PI值,一個巨大的PI值(約100個小數和更多),他們還在不同的,我試過使用cmath
而不是math.h
,我試圖使用M_PI
而不是我自己定義的PI
。
其差值總是相同的,大約在小數點後16位。不要誤解我的意思,我知道我永遠不會得到這些數字的100%精確值,但至少我期望得到相互補充角度的sin
和cos
相同的「不精確」值。這一切到底是什麼錯誤?
我需要他們一樣,因爲我的工作(重力模擬器我被要求做)的程序使用具有double
(我也試過float
)對象它們基本上角度變量(度或弧度,我都試過)。這些是物體移動的方向,也需要角度來計算物體之間的相互作用。
在程序的每一次迭代中角度都會改變,並且在每次迭代中,角度都會根據前一次迭代角度的計算而改變,所以如果在任何一點上有任何最小錯誤的角度值,該誤差會被放大得更多並在每一次迭代中更多。
該程序運行數千甚至數百萬次的迭代,所以該值的錯誤變得荒謬可笑!說得清楚,行星最終得到了他們的平衡,一切都變得一場災難,我真的瘋了:(
附言:我在Windows 7中,32位。
這裏只有約16的精度十進制數字在編譯雙倍。 – ooga
嗯,我知道我永遠不會爲罪(45)獲得完美的價值,這樣的價值不存在,完美的圓形PI值也不存在,但我至少期待互補的角度出錯以相同的方式:/ – Dimakhaerus
您可能想要查找(或實現)符號計算庫。當然,你會爲了精確而犧牲性能。 –