错误34,结果太大 [英] Error 34, Result too large

查看:69
本文介绍了错误34,结果太大的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试打印斐波那契序列,但它总是在大约第600个项之后返回溢出错误。

def fib():

    import math
    from math import sqrt
    print "
Fibonacci Sequence up to the term of what?"
    n=raw_input(prompt)
    if n.isdigit():
        if int(n)==0:
            return 0
        elif int(n)==1:
            return 1
        else:
            n_count=2
            print "
0
1"
            while n_count<int(n):
                fib=int(((1+sqrt(5))**n_count-(1-sqrt(5))**n_count)/(2**n_count*sqrt(5)))
                print fib
                n_count+=1
            fib()
    else:
        print "
Please enter a number."
        fib()
fib()

当我运行此命令时:

Traceback (most recent call last):
  File "<pyshell#21>", line 1, in <module>
    fib()
  File "<pyshell#20>", line 15, in fib
    fib=int(((1+sqrt(5))**n_count-(1-sqrt(5))**n_count)/(2**n_count*sqrt(5)))
OverflowError: (34, 'Result too large')

推荐答案

首先,让我们将这个大的表达式拆分成几个较小的表达式,这样我们就可以看到它出了什么问题。并使用调试器或一些print语句来查看是什么值导致它出错。这样,我们就不只是在黑暗中刺伤了。

如果这样做,则可以看出(1+sqrt(5)**n_count)n_count命中605时引发此异常。您可以很容易地进行验证:

>>> (1+sqrt(5))**604
1.1237044275099689e+308
>>> (1+sqrt(5))**605
OverflowError: (34, 'Result too large')

那么,为什么这是一个问题?

嗯,与它的整数不同,Pythonfloat值不是任意大小的,它们只能容纳IEEE double可以容纳的值:*

>>> 1e308
1e308
>>> 1e309
inf

因此,问题是等式中的一项大于最大可能的IEEE双精度。

这意味着您要么需要选择不同的算法**,要么需要一个"大浮动"库。

碰巧的是,decimal模块中有一个内置的大浮点库。当然,顾名思义,它处理的是十进制浮点数,而不是二进制浮点数,所以如果使用它,您会得到不同的舍入误差。但是,考虑到您的代码,您大概不太关心舍入误差。

所以:

import decimal
s5 = decimal.Decimal(5).sqrt()

…然后是…

fib=int(((1+s5)**n_count-(1-s5)**n_count)/(2**n_count*s5))

*事实上,限制是特定于平台的;实现不是必需的将IEEE Double用于float。因此,请使用sys.float_info查看您的平台的最大值。但几乎总是1.7976931348623157e+308

**请注意,与简单的算法相比,您正在使用的算法的唯一优点是,它允许您直接近似第N个斐波纳契数,而不需要计算前面的N-1。但既然你无论如何都想把它们全部打印出来,你就不会得到任何好处。你只是得到了缺点--它是一个近似值;它更复杂;它需要浮点数学,这容易产生舍入误差;它更慢;它需要更多的内存;大多数平台上大多数语言中的内置浮点类型无法容纳F(605)、…所有这些都没有好处,似乎不值得这样做。

这篇关于错误34,结果太大的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆