计算机的错误计算(十八)

摘要  计算机的错误计算(四)指出一元二次方程的计算精度问题。本节给出其一种解决方案。

       计算机的错误计算(四)(十七)分别指出一元二次方程的求解是具有挑战性的难题,其出错原因是因为相减相消而导致损失了精度。

       下面我们仔细分析。

       一元二次方程   ax^2+bx+c=0\, (a\neq0)   的求根公式为

x_{1,2}=\frac{-b\pm\sqrt{b^2-4ac}}{2a}.

       当  b^2>>|4ac| 时,|-b| 与 \sqrt{b^2-4ac} 会很接近,这样,-b\pm\sqrt{b^2-4ac}  中一个运算就会发生相减相消。

       比如,若 b>0, 则  -b+\sqrt{b^2-4ac} 有相减相消发生;相反,若  b<0, 则 -b-\sqrt{b^2-4ac}  会发生相减相消。 相减相消的根源在于“相减”,那么如何去掉这个“相减”呢?若您中学数学学得好,不难想到,用公式  (x-y)(x+y)=x^2-y^2.  即分子分母同乘以  -b\textcolor{red}{\mp}\sqrt{b^2-4ac} (这时是同号的两数相加),让“分子有理化” : 

x_{1,2}=\frac{-b\textcolor{blue}{\pm}\sqrt{b^2-4ac}}{2a}=\frac{(-b\textcolor{blue}{\pm}\sqrt{b^2-4ac})(-b\textcolor{red}{\mp}\sqrt{b^2-4ac})}{2a(-b\textcolor{red}{\mp}\sqrt{b^2-4ac})}=\frac{2c}{-b\textcolor{red}{\mp}\sqrt{b^2-4ac}}.

       上式就是一种很好的解决方案。它没有增加计算量或复杂度。

例1.  (续计算机的错误计算(四)的例1)已知 a=10^{-17}, b=-10^{17}, c=10^{17},计算其较小的根。

       显然,由于

 \left\{\begin{matrix} b^2&>>&|4ac|,\\ b&<&0, \end{matrix}\right.

因此较小的根  \frac{-b-\sqrt{b^2-4ac}}{2a} 会发生相减相消。

       现在,利用新的公式  {\frac{2c}{-b+\sqrt{b^2-4ac}}} 编程如下:

double\,\, a=1e-17;\\ double\,\, b=-1e17;\\ double\,\, c=1e17;\\ printf("\%lf",\textcolor{red}{(2*c)/(-b+sqrt(b*b-4*a*c))});

在 Visual Studio 2010 中运行它,则输出为正确结果1。

       最后,问一句:任给一个可能发生相减相消的算式,若找不到对应的替代公式怎么办?去不掉相减相消该怎么办?

       答案是:采用高精度计算。那么问题又来了,高到多少?很简单:损失多少,增加多少。

       若遇到了,不知结果对不对,不妨先在这里试试(这个是万能的,任何算术表达式都能得出正确结果。后面有机会再介绍):ISReal 计算器, 可信计算icon-default.png?t=N7T8http://www.isrealsoft.cn/

  • 14
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值