|
|
发表于 2006-2-10 23:39:00
|
显示全部楼层
Re: Re: Re: Re:我怎么觉得越来越少新人学编程
黑鸟: Re: Re: Re:我怎么觉得越来越少新人学编程
--------------------------------------------------------------------
if(a!=0)
x1=(-b+sqrt(...
你这个单纯的实现有很多问题。
首先,开方的问题只要是人都会注意到,根本不值一提。所以我的解答只是用了sqroot来抽象这个操作,并没有特意指出。但是没想到某人会在这个上面大做文章,我无语……
其次,并不是所有人都会注意到的一个问题是,传统的一元二次方程符号解法是
x1=(-b+sqrt(b^2-4ac))/2a,
x2=...
注意看x1,假设b>>ac,导致x1的分子部分两个非常接近的浮点数b和sqrt(b^2-4ac)相减,这会造成大量的有效数字丢失。这是浮点数运算中需要绝对避免的运算之一。另外几个需要避免的问题包括除以非常接近零的浮点数等。如果你不熟悉这个问题,可以参考
http://sxyd.sdut.edu.cn/shuzhifenxi/1.2/szfx012.htm
上面有个 “用四位浮点数计算“ 导致有效数字大量丢失的例子。
然而幸运的是,这个问题是可以避免的,只要我们不让两个非常接近的浮点数相减就可以了。
所以一些有智慧的学者用下面这个公式计算x1,
x1=-2c/(b+sqroot(b^2-4ac))。
注意,上面这个公式和原先的公式是完全等价的,只不过是用了分子有理化的操作,某人居然就不认识了,还说是错的,我再次无语……
你的实现中最后一个也是最大的问题,你把问题局限在整数范围,这是非常要命的……如果我来实现的话,最起码也要把类型参数化,也就是说用template来实现。 |
|