Хотя цикл, включающий числа с плавающей запятой [duplicate]

Возьмем простой векторный класс:

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

Мы хотим иметь метод, который вычисляет длину. Как бы это выглядело, если бы мы хотели определить его внутри класса?

    def length(self):
        return math.sqrt(self.x ** 2 + self.y ** 2)

Как это должно выглядеть, когда мы должны определять его как глобальный метод / функцию?

def length_global(vector):
    return math.sqrt(vector.x ** 2 + vector.y ** 2)

Таким образом, вся структура остается прежней. Как я могу это использовать? Если на какой-то момент мы предположим, что мы не записали метод length для нашего класса Vector, мы могли бы это сделать:

Vector.length_new = length_global
v = Vector(3, 4)
print(v.length_new()) # 5.0

Это работает, потому что первый параметр length_global, может быть повторно использован как параметр self в length_new. Это было бы невозможно без явного self.


Другой способ понять необходимость явного self - увидеть, где Python добавляет некоторый синтаксический сахар. Когда вы помните, что в основном вызов, подобный

v_instance.length()

, внутренне преобразован в

Vector.length(v_instance)

, легко увидеть, где находится self. на самом деле не пишите методы экземпляра в Python; то, что вы пишете, это методы класса, которые должны принимать экземпляр в качестве первого параметра. И поэтому вам нужно будет явно указать параметр экземпляра.

2
задан unwind 24 September 2013 в 16:46
поделиться

1 ответ

   float x=1.1;                    
   while (x==1.1)

float и double variables не способны хранить точное значение 1.1, только очень близкое приближение. Точное значение в float и double будет немного отличаться из-за разницы в точности.

1.1 является значением double . Вы храните 1.1 как двойной в поплавок, который немного изменит значение. Затем вы сравниваете его с двойным значением 1.1, поэтому он не будет равным и никогда не войдет в ваше состояние.

Для этого вам нужно написать 1.1f, чтобы убедиться, что вы работаете с тем же тип данных везде. Кроме того, я уверен, что кто-то еще объяснит, почему сравнение значений с плавающей точкой для точного равенства часто является плохой идеей.

7
ответ дан jcoder 24 August 2018 в 02:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: