13.4.2 通过检测避免极值
由于问题出在x→±∞时,因此可以对这种情形进行检测。由于在x→±∞的过程中,x*x+y*y最先出现溢出,于是有:
- temp = x*x + y*y;
- if( !_finite(temp) )
- {
- if( temp > 0.0 )
- theta = 0.0;
- else
- theta = MATH_PI;
- }
- else
- theta = acos( x/sqrt(temp) );
这种处理有一个小缺陷,即认为x*x+y*y发生溢出时theta=0.0,这就是将x当作了+∞处理。由于x*x+y*y出现溢出时,x尚未溢出,这种处理带来一点误差。不过由于这种情况极少见,而且误差很小,一般不会造成不良影响。
算例:x=1.0E+300、y=1.0,theta=0.0(真值是1.0E-300)。
【责任编辑:
董书 TEL:(010)68476606】