Уведомления

Группа в Telegram: @pythonsu

#1 Март 24, 2011 01:15:02

garza
От:
Зарегистрирован: 2011-03-14
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу отловить ошибку в программе

вот есть такая функция


def get_Llamba(E2, basis_RS, dom_weights, lamba_combi, select, n):

result = list()

if select == 1:
N = n
elif select == 2:
N = 2
elif select == 3:
N = 1
elif select == 4:
N = 2

for i in xrange(len(E2)):
tmp = 0
cps = 0
for j in xrange(len(dom_weights)):
tmp = (get_norma(scalar_vp(dom_weights[j], N)))**2
tmp = tmp/((get_norma(scalar_vp(basis_RS[j], N)))**2)
cps = cp(scalar_vp(dom_weights[j], N), minus_vp(scalar_vp(lamba_combi, N), scalar_vp(E2[i], N)))
tmp = tmp*cps
print tmp
print check_cp(tmp)
print "------------------------"




return result
#проверяет число целое и c>=0
def check_cp(c):
if int(c) == c and c>=0:
return 1
else:
return 0
она не полностью готова но суть в том что вот я вычислил tmp.
результат подаю в функцию check_cp. Она чекает является ли число целым и больше ли оно нуля. ну так вот результат совсем неожиданный!!!

результат:
4.0
0
------------------------
4.0
1
------------------------
4.0
0
------------------------
2.0
0
------------------------
2.0
1
------------------------
2.0
0
------------------------
2.0
0
------------------------
0.0
1
------------------------
0.0
1
------------------------
2.0
0
------------------------
0.0
1
------------------------
-2.0
0
------------------------
0.0
1
------------------------
0.0
1
------------------------
0.0
1
как видите для одинаковых чисел разный результат!!! как быть? ничего не пойму, причем я использую такую проверку и в других местах программы и там она работает абсолютно адекватно! пробовал менять название функции и использовать в каждом месте отдельно - эффекта нет, тоже самое получается, именно на этом участке вот такая фигня. помогите плз!



Офлайн

#2 Март 24, 2011 03:25:10

dimabest
От:
Зарегистрирован: 2009-02-12
Сообщения: 253
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу отловить ошибку в программе

Проблема в этом условии: if int© == c

Надеюсь, пример подскажет почему:

>>> c = 0.1 + 0.2
>>> c
0.30000000000000004
>>> i = c * 10
>>> i
3.0000000000000004
>>> print i
3.0
>>> int(i) == i
False



Отредактировано (Март 24, 2011 03:26:10)

Офлайн

#3 Март 24, 2011 13:05:47

garza
От:
Зарегистрирован: 2011-03-14
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу отловить ошибку в программе

Тогда можете предложить как проверку сделать чисел float? на целые



Офлайн

#4 Март 24, 2011 13:07:51

garza
От:
Зарегистрирован: 2011-03-14
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу отловить ошибку в программе

>>> c = 0.1 + 0.2
>>> c
0.30000000000000004

как такое получается вообще? разве не должно быть просто 0.3 ?



Офлайн

#5 Март 24, 2011 14:23:55

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Не могу отловить ошибку в программе

Да что же это такое! Третий раз за месяц.
http://asvetlov.blogspot.com/2011/02/blog-post.html

Числа с плавающей запятой следует сравнивать как abs(c - int©) < 1e-9 (порог подберите сами).



Офлайн

#6 Март 24, 2011 19:47:43

Actor
От:
Зарегистрирован: 2010-10-10
Сообщения: 39
Репутация: +  0  -
Профиль  

Не могу отловить ошибку в программе

введи погрешность измерения



Офлайн

#7 Март 24, 2011 21:03:56

garza
От:
Зарегистрирован: 2011-03-14
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Не могу отловить ошибку в программе

Андрей Светлов
порог подберите сами
а с этим можете помочь? тут такое дело. все равно не пойму как быть в таком случае. подбирать порог не получается т.к вывод вот такой:

vector =
basis =
lambaj =
combi =
tmp =4.0
check_cp(tmp) =0
abs(int(tmp) - tmp) =1.0
————————
vector =
basis =
lambaj =
combi =
tmp =4.0
check_cp(tmp) =1
abs(int(tmp) - tmp) =0.0


руками считал, tmp в обоих случаях ровно 4.
но почему в одном случае он посчитал все верно а во втором показал абсолютную разность в целую единицу? помогите пожалуйста! не знаю что и делать, надо дописывать прогу, а застрял на тут…



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version