Почему Python генерирует исключение 'OverFlow' при вычислении с плавающей запятой? - PullRequest
2 голосов
/ 25 августа 2011

Я только начинаю изучать Python (извините, не требуйте домашнего задания, потому что это не так).Просто чтобы дать себе несколько значимых упражнений, чтобы улучшить синтаксис и функции, я следую за этим URL: 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

Я все сделал, пытаясь набрать текстinput, чтобы использовать некоторые операции-оболочки для округления или определения точности десятичной точки.Я даже использовал модуль Decimal, чтобы попытаться распечатать десятичное число в строковом формате, чтобы увидеть, где моя логическая ошибка.

Есть ли у кого-нибудь на этот счет, чтобы обучить меня в области вычислений с плавающей запятой в Python?

1 Ответ

2 голосов
/ 25 августа 2011

input() дает вам только плавание, если оно действительно видит что-то похожее на плавание; если оно выглядит как целое число, то вы получите целое число. Вместо этого используйте float(raw_input()).

Теперь, что касается переполнения.

В старых версиях Python int до long автоматически не повышалось, что означает, что максимальное целое число, которое вы можете иметь, является 32- или 64-битным; любое более высокое значение приводит к переполнению. Поскольку в вашем выражении есть целые числа (см. Выше), вы можете нарушить максимальное значение для типа, что приведет к исключению, которое вы видите.

...