Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 4, 2012 03:30:40

ingushet
Зарегистрирован: 2012-10-30
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает условие, либо не сохраняются значения!

Здравствуйте!
Имеется класс:

class Tochki(object):
    d = 0;
    s = 0;
Создаю массив экземпляров этого класса:
m6=[Tochki() for each in range(2003001)]

Заполняю атрибуты для каждого объекта:
sh=52.2378+0.0001;k=0.0001;
dl=103.9847-0.0001;k1=0.0001;
n=0;
for i in range(1001):
    for j in range(2001):
        m6[j+n].s=sh-k;
        m6[j+n].d=dl+k1;
        k1=k1+0.0001;
    k=k+0.0001;
    n=n+2001;
    k1=0.0001;

Проверяю верно ли внес значения:
h=0;
for i in range(1001):
    print m6[h].s
    h=h+2001
Выводит все верно.
Пытаюсь найти значение 52.1791:
for i in range(2003001):
    if m6[i].s==52.1791:
       print i
Он ничего не находит, хотя когда вывожу на экран весь массив это значение есть. Может условие по другому поставить?

Офлайн

#2 Ноя. 4, 2012 07:24:43

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Не работает условие, либо не сохраняются значения!

Тебе же позавчера уже все объяснили, про атрибуты класса и атрибуты объекта.
Уже уже тупость какая-то.



Офлайн

#3 Ноя. 4, 2012 07:36:50

ingushet
Зарегистрирован: 2012-10-30
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает условие, либо не сохраняются значения!

это работало с массивом, с обычными значениями не работает!
Вот код, здесь я создал массив вне класса:

m=range(1001);
sh=52.2378+0.0001;k=0.0001;
n=0;
for i in range(1001):
    for j in range(2001):
        k1=k1+0.0001;
    m[i]=sh-k;
    k=k+0.0001;
    n=n+2001;
  
Делаю вывод:
print m[587]

Он выводит 52.1791.
Тут же делаю условие:
if m[587]==52.1791:print "dfgsdfg"

Он ничего не выводит!

Отредактировано ingushet (Ноя. 4, 2012 07:37:25)

Офлайн

#4 Ноя. 4, 2012 08:05:28

Edinonog
Зарегистрирован: 2012-11-04
Сообщения: 8
Репутация: +  1  -
Профиль   Отправить e-mail  

Не работает условие, либо не сохраняются значения!

Потому что это всё очень похоже на троллинг.
Если нет, то используйте это:

if m[587] == 52.179+0.0001:
print "dfgsdfg"

Офлайн

#5 Ноя. 4, 2012 08:08:57

ingushet
Зарегистрирован: 2012-10-30
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает условие, либо не сохраняются значения!

Спасибо заработало, а почему не работало:

if m[587]==52.1791:print "dfgsdfg"

Офлайн

#6 Ноя. 4, 2012 08:44:52

Edinonog
Зарегистрирован: 2012-11-04
Сообщения: 8
Репутация: +  1  -
Профиль   Отправить e-mail  

Не работает условие, либо не сохраняются значения!

Потому что арифметика чисел с плавающей точкой иногда бывает весьма коварной штукой. Например первоначальный код заработал бы при условии:

if m[587] == 52.17910000000000536601874046027660369873046875:
     print "dfgsdfg"

Для того чтобы узнать “истинное” значение можно воспользоваться:
import decimal
m = range(1001)
sh = 52.2378 + 0.0001
k = 0.0001
k1 = 0.0001
n = 0
for i in range(1001):
    for j in range(2001):
        k1 = k1 + 0.0001
    m[i] = sh - k
    k = k + 0.0001
    n = n + 2001
print m[587]
a = decimal.Decimal(m[587])
if m[587] == a:
    print "dfgsdfg"

Ссылка на документацию по этой теме: http://docs.python.org/2/tutorial/floatingpoint.html

Отредактировано Edinonog (Ноя. 4, 2012 08:45:30)

Офлайн

#7 Ноя. 4, 2012 09:17:55

ingushet
Зарегистрирован: 2012-10-30
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Не работает условие, либо не сохраняются значения!

Сделал так:

if round(m1[587],4)==52.1791:
       print "dkfbvkdfvblsdfvblskfd"
Работает

Офлайн

#8 Ноя. 4, 2012 14:53:32

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Не работает условие, либо не сохраняются значения!

> Работает
Потому что повезло, а не потому что правильно сделал. Ну это же первый класс, ну нельзя так делать. Читай про вещественные числа в выч. технике.
Всегда исходи из того что, есть ещё один знак, которого ты не видишь, десятый или сотый после запятой и никогда не используй проверку на равенство вещественных числел. Исключением может быть ноль, но я бы не советовал.

if int(m1[587] * 10000) == 521791:
    print 'Учи матчасть'

..bw



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version