13.4.4 将表达式变形避免极值

2013-10-07 00:52:58 · 作者: · 浏览: 82

13.4.4  将表达式变形避免极值

将表达式变形一下,得到:

  1. 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的精度很低。这将带来计算误差。因此,还可以变形为:

  1. theta = arctan( y/x ) 

这个表达式既避免了x→±∞时的溢出问题,又避免了有效数字不够的问题。不过,这个变形导致值域发生了变化,需要修正:

  1. if( theta < 0.0 )  
  2.     theta += MATH_PI; 

算例:x=1.0E+300、y=1.0,theta=1.0E-300(真值是1.0E-300)。

从这个算例上看,变形为theta=arctan(y/x)既避免了极值问题,又提高了精度。

【责任编辑:董书 TEL:(010)68476606】

回书目   上一节   下一节