加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
本帖最后由 RyanBern 于 2015-3-14 21:10 编辑
人们要研究各种算法,这是为什么呢?因为人类的科技不够强大,不足以发明每秒钟能进行无穷此运算的机器。如果这一天真的来临,那么那些研究算法的人都可以下岗了(雾)。
人们要研究各种各样数值稳定的算法,这又是为什么呢?因为人类的科技不够强大,不足以发明能存储无限长浮点数的机器。(雾)
对第一个问题大家可能比较熟悉,效率低的渣算法可以让你的电脑卡机没商量。
第二个问题的印象就不那么直观了,因为浮点数总有误差,而误差的累积是致命的。
昨天做的一个题目就能很好反应这一点。
计算普通定积分In,求n=1,2,3,...,50的值:
不难证明,In有以下递推式(如果证不出来承认其是对的即可):
有了递推式,就可以写代码来算了:
x = Math.log(1.2) (1..50).each do |i| x = -5 * x + 1.0 / i print sprintf("%d: %f\n", i, x) end
x = Math.log(1.2)
(1..50).each do |i|
x = -5 * x + 1.0 / i
print sprintf("%d: %f\n", i, x)
end
结果是这样的:
感觉哪里不太对劲的样子……
实际上,n=17左右的数就已经不对了。
但是,如果换一个递推式,计算将会变得很准确:
虽然I50不取0,但是即便这样,仍然能够准确算出0~45的值!
不禁感叹要是能有存储任意长浮点数的计算机就好了。 |