13.4.4 将表达式变形避免极值
将表达式变形一下,得到:
- theta = arcos( 1.0/sqrt( 1.0 + (y/x)2 )
当x→±∞时,y/x→0,theta=arcos(1.0),得到theta=0.0,结果正确。因此,这种处理可以避免由于x→±∞时造成的错误。不过这种处理带来另外一个问题,那就是当x→±∞时,(y/x)2→0是个非常小的量,此时由于有效数字有限以及1.0的存在,导致1.0+(y/x)2的精度很低。这将带来计算误差。因此,还可以变形为:
- theta = arctan( y/x )
这个表达式既避免了x→±∞时的溢出问题,又避免了有效数字不够的问题。不过,这个变形导致值域发生了变化,需要修正:
- if( theta < 0.0 )
- theta += MATH_PI;
算例:x=1.0E+300、y=1.0,theta=1.0E-300(真值是1.0E-300)。
从这个算例上看,变形为theta=arctan(y/x)既避免了极值问题,又提高了精度。
【责任编辑:
董书 TEL:(010)68476606】