大家都知道,函數sin和cos的值的範圍爲[-1,1]。
在計算機中,由於計算位數有限,導致運算產生誤差。對於32位計算機,該誤差已經降低到非常非常小了,而64位和128就更小了。然,不管怎樣,即使是1/(2^32)甚至1/(2^128),那也是事實存在可以被計算機識別的。
當採用Java Math的反正弦和反餘弦函數時,如果參數存在那樣的誤差,那就悲劇了。
所以,如果參與反正弦和反餘弦計算的參量param是通過某一運算得到的,那麼在對其進行反正弦和反餘弦計算之前,一定要先進行處理
if(param<-1.0)
param=-1.0;
else if(param>1.0)
param=1.0;
否則,就會出現NaN的數據了。
如果說計算中的param會出現2.0、100或者其他更大參數的,那另當處理,這裏只是確保param在-1到1之間,只是由於計算精度問題產生的<-1.0和>1.0的情況可通過此方法進行屏蔽。