Pull to refresh

Comments 17

Спасибо, за интересный материал. Я бы еще добавил абзац про работу с натуальными дробями с помощью модуля fractions для полноты картины.

«Вот — интересный метод .as_integer_ratio()»

Этот метод -- натуральная и ненужная ерунда. У меня, когда я его проверял, кажется, не было ни одного совпадения, когда я создавал вещественное число на основе дроби двух целых чисел, а потом пытался провести обратную операцию методом 'as_integer_ratio'. Пришлось писать собственную функцию на основе классического бесконечного алгоритма представления вещественного числа дробью из целых чисел.

Если под "создавал вещественное число" имеется ввиду float, то он по своему представлению может иметь в знаменателе только степени двойки. Соответственно все дроби с другим знаменателем будут представлены с округлением, с потерей точности. И любой алгоритм подбора дроби целых чисел из float, который даст в знаменателе не степень двойки - тоже округление и потеря точности от значения float.

Круто, мне понравилось. Узнал немного нового

Если обойтись без скобок — при попытке вызова метода на целочисленном литерале будет выдана ошибка SyntaxError.
>>> 255 .to_bytes(2, 'big')
b'\x00\xff'
В переводе (особенно в коде) потеряли кучу символов. Не надо так.

Например, у дроби 13 нет конечного десятичного представления (после десятичной точки идёт бесконечное множество троек). А у дроби 110 нет конечного представления в виде двоичной дроби.

Наверное, этот нумерованный список дробей тоже не вошёл в статью...

Это не нумерованный список, а потерянный слеш.

13 => 1/3

110 => 1/10

В описании класса ExtendedInteger почти у всех методов пропущены двойные подчёркивания. Это же «магические» методы

числа с плавающей точкой, представляющие суммы в некоей валюте

ОМГ, никогда не храните суммы в валюте в числах с плавающей точкой

Кроме float("inf"), также есть float("-inf").

Еще в двух местах знак деления потерялся: "у дроби 13" -> "у дроби 1/3", и дальше аналогично про 1/10.

Один из способов представления числа 1729 в виде суммы двух кубов — это 13 + 123. Можете отыскать второй способ?

print([(x,y) for x in range(13) for y in range(x) if x*x*x+y*y*y==1729])

[(10, 9), (12, 1)]

Интересно, как ведёт себя функцияf(n) равная минимальному числу, разлагающемуся в сумму 2-х кубовnразными способами. Знаем, чтоf(2)=1729

f(3) = 87\:539\:319 = 167^3 + 436^3 = 228^3 + 423^3 = 255^3 + 414^3

Для f(4) ответ явно больше, чем 2\cdot 10^9

так, а что нового-то? всё это более подробно, в более сжатой и простой форме есть в документации.

>>> # Объекты Fractions - это не наследники Rational

>>> from fractions import Fraction

>>> isinstance(Fraction(1, 2), numbers.Rational)

True

Наверное, имелось ввиду противоположное — "являются наследниками Rational"?

Метод from_bytes() штука, конечно, интересная (есть, например, возможность менять порядок байт), но питон достаточно умен и запись n = 0xff тоже воспринимает и запишет в n число 255, операция обратного перевода также легко реализуется

n = 0xff
print(n) # 255

s = hex(255)
print(s) # '0xff'

Sign up to leave a comment.