为什么Python在浮点计算中抛出'OverFlow'异常?

时间:2011-08-25 00:36:16

标签: python floating-point overflow

我刚刚开始学习Python(对不起,不要在这个上做主题,因为它不是)。只是为了给自己做一些有意义的练习来改善语法和功能,我一直在关注这个网址:http://www.cs.washington.edu/homes/stepp/bridge/2007/exercises.html

我通过一些浮点计算得到的这个特殊的“溢出”问题让我感到很困惑。

这是我收到的错误消息:

Traceback (most recent call last):
  File "./lab0102.py", line 28, in <module>
    payment = PMT(r, n, P)
  File "./lab0102.py", line 19, in PMT
    return round(P * ((r *((1+r)**num_pmts)) / ((1+r)**num_pmts)))
OverflowError: (34, 'Numerical result out of range')

这是我的代码:

import math
#from decimal import Decimal

def PMT(r, n, P):
    rate = (r/100)/12
    print "rate:", rate
    num_pmts = n*12

    payment = P * ((r *((1+r)**num_pmts)) / ((1+r)**num_pmts))
    return payment

print "This program computes monthly loan payments."

P = input("Loan Amount? ")
n = input("Number of Years? ")
r = input("Interest Rate? ")

payment = PMT(r, n, P)

print "You payment is", payment

我通过尝试输入类型来完成所有操作,使用一些包装操作来舍入或指定小数点精度。我甚至使用Decimal模块尝试以字符串格式打印出小数,以查看我的逻辑缺陷。

在这篇文章中有任何人在Python中浮点计算领域教育我吗?

1 个答案:

答案 0 :(得分:2)

input()只有在实际看到看起来像浮子的东西时才会给你浮动;如果它看起来像一个整数,那么你将得到一个整数。请改用float(raw_input())

现在,关于溢出。

旧版本的Python没有自动将int提升为long,这意味着您可以拥有的最大整数为32位或64位;任何高于此值都会导致溢出。由于表达式中有整数(见上文),您可能会突破该类型的最大值,从而导致您看到的异常。