大家都知道,函数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的情况可通过此方法进行屏蔽。