设为首页 加入收藏

TOP

13.4.1 问题的提出
2013-10-07 00:52:38 来源: 作者: 【 】 浏览:70
Tags:13.4.1 问题 提出

13.4  避免极值

有些表达式在输入参数是某些特殊值时会出现极端现象,如结果是无穷大,这会导致计算错误。这种现象很多,也没有什么好的通用的解决方法,一般通过检测和表达式变形避免计算错误。本节用一个例子说明这个问题。

在下面的分析中,假设溢出异常已被屏蔽,且按第2章的论述设置了适当的返回值。代码中所有数据类型均是双精度格式(即double类型)。

13.4.1  问题的提出

考虑通过直角坐标计算夹角的表达式:

  1. theta = arcos(x/sqrt(x*x + y*y)) 

这个表达式的数学含义如图13-1所示。

 

这个表达式当x→±∞时,theta→0.0或 。但是,在计算过程中,当x→±∞时,x*x+y*y、x*x、x会依次出现溢出,导致结果可能出错。

当x→±∞时,有下列两种情形:

(1)x*x+y*y或x*x溢出,x没有溢出

由于x*x+y*y或x*x溢出,x*x+y*y的计算结果是+∞,故sqrt(x*x+y*y)得到+∞。由于x没有溢出,是个有限值,x/sqrt( x*x + y*y )=>x/+∞得到0.0。最后,得到的theta=arcos(0.0)是 /2,是错误的。

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

(2)x溢出

由于x溢出,因此x*x和x*x+y*y必然溢出,得到±∞/+∞。这是一个非法运算,因此得到NaN。于是,theta=arcos(NaN),得到NaN,是错误的。

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

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

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇13.4.2 通过检测避免极值 下一篇13.3.3 算法方式

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: