Ошибка TypeError: 'float' object cannot be interpreted as an integer в range
Не понимаю кое-чего. Вот хочу просто вывести корень из a (код внизу):
def root(a):
s=()
for i in range(int(a),int(-a),0.0000001):
x=a/i
if x==i: s.append(x)
else: continue
return s
получаю ошибку:
Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
print(Math.operation.root(2)
File "D:\Pashka2\Programme\Python\Math.py", line 40, in root
for i in range(int(a),int(-a),0.0000001):
TypeError: 'float' object cannot be interpreted as an integer
Почему возникает это исключение, и как мне исправить ошибку?
Заранее спасибо!
Ответы (1 шт):
Автор решения: insolor
→ Ссылка
range не работает с дробными параметрами, только с целочисленными. Как вариант, можно реализовать свой range, который будет уметь работать с float, например:
def frange(x, y, jump):
while x < y:
yield x
x += jump
step = 0.000001
def root(a):
s = []
for i in frange(-a, a, step):
x = a/i
if abs(x - i) < step:
s.append(x)
# Для более точного результата можно заменить на s.append((x+i)/2)
return s
print(root(4))
Функция frange взята из этого ответа: range() for floats @kichik (перечеркнутый пример кода в начале ответа)
Вывод:
[-2.000000000279556, 1.9999999998691407]
C s.append((x+i)/2):
[-2.0, 2.0]
Обратите внимание, что я заменил проверку на точное равенство на приблизительное
( |x-i| < step, т.е. разница между x и i по модулю меньше шага), иначе будет возвращаться пустой список.