Post #268
477

Цитата дня
ПИ @pythonic_attacks
Showing posts older than #269 · Back to latest


float и его погрешности.>>> 0.1
0.1
Но это число нельзя точно представить в двоичном виде, в любом случае это будет лишь аппроксимация, приближение. Так что то, что показал питон — это лишь округление, это чтобы не пугать людей. Можно посмотреть на точное значение, которое хранится внутри float, например, при помощи конвертации числа в decimal.Decimal:>>> Decimal.from_float(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
Кстати, именно поэтому Decimal лучше создавать из строк, например, из "0.1", а не из 0.1. Потому что если вы использовали float, то Decimal сохранит его значение максимально точно, то есть тоже будет лишь аппроксимацией, и все дальнейшие вычисления будут содержать эту изначальную погрешность.float достаточно точно может описывать числа вокруг нуля, но чем дальше, тем сильнее падает точность аппроксимации. Например, между вот такими числами разница во float уже не представима:>>> Decimal.from_float(10.0 ** 16)
Decimal('10000000000000000')
>>> Decimal.from_float(10000000000000000.1)
Decimal('10000000000000000')
В какой-то момент float вообще перестаёт мочь представлять точно даже целые числа, например, 10 ** 22 всё ещё представимо:>>> Decimal.from_float(10.0 ** 22)
Decimal('10000000000000000000000')
А вот 10 ** 23 уже нет:>>> Decimal.from_float(10.0 ** 23)
Decimal('100000000000000008388608')
Бабах! Ошибка на восемь миллионов, но это самая точная аппроксимация, которую можно выразить на 64 битах, выделенных под число (на самом деле, мантисса числа — самая важная часть — занимает лишь 53 бита). И это мы ещё даже никаких операций над числами не делали, просто их создаём.10 ** 23 денег. Возможно, если конвертировать все накопления Джефа Безоса (самый богатый человек) в иранские риалы (самая дешевая валюта)... 🤔 Остаётся только надеяться, что его банк не использует float для хранения баланса.float с большими числами.float: https://docs.python.org/3/tutorial/floatingpoint.htmlfloat'ами. Берётся список чисел:>>> mylist = [И складывается, начиная сначала с одного конца, а затем с другого:
... 614.3,
... 453.44,
... 220.8,
... 514.32,
... 322.32,
... 330.3,
... 230.3,
... 518.32,
... 419.52]
>>> sum(mylist) == sum(mylist[::-1])И суммы не сходятся.
False
a + (b + c) не всегда равно (a + b) + c. То есть в зависимости от порядка, в котором складывать числа, погрешность может накапливаться по-разному. Для меня стало открытием, что арифметика сломана настолько.>>> ε = 1e-16 # small number
>>> print(left := (1 + ε) + ε)
1.0
>>> print(right := 1 + (ε + ε))
1.0000000000000002
>>> left == right
False
Есть специальные алгоритмы, которые позволяют избегать погрешностей при сложении чисел с плавающей точкой, и один из них реализован в стандартной библиотеке как math.fsum:>>> import mathИ раз уж мы затронули тему чисел с плавающей точкой, то пара хороших советов, которые помогут избежать проблем:
>>> math.fsum(mylist) == math.fsum(mylist[::-1])
True
decimal.Decimal — да, будет значительно медленнее, но зато точно:>>> 0.1 + 0.2🍁 А если вы считаете деньги, то просто выражайте суммы в целых числах (центы и копейки вместо долларов и рублей) — так будет намного проще и надёжнее. Не используйте
0.30000000000000004
>>> from decimal import Decimal
>>> Decimal("0.1") + Decimal("0.2")
Decimal('0.3')
float для денежных расчётов! Если вы думаете, что погрешности у float начинаются только где-то в пятнадцатом знаке после запятой, то у меня для вас плохие новости — чем больше числа, тем больше и погрешности. Цена даже одной ошибки может быть очень высока 😬apt или dnf), а какие-то пришлось ставить через pip? Потом в какой-то момент всё ужасно перепутывается, дальше в попытках починить возникший хаос по подсказке из интернета делается что-то типа sudo pip uninstall <very_important_package_os_relies_on>, и... всё. Точка невозврата пройдена, дальше проще уже переустановить ОС, чем вернуть всё в рабочее состояние.PEP 668, который призван решить эту проблему. Документ разграничивает области ответственности системных пакетных менеджеров, которые управляют питоном, и pip, так чтобы они не мешали друг другу. Грубо говоря, ребята хотят отучить pip ломать операционные системы. Если этот PEP примут, то отхватить проблем всё ещё будет можно, но сложнее, и везде будут предупреждающие сообщения, так что по крайней мере новички перестанут попадаться в эту ловушку.Forwarded from Кафедра около-всяческих наук🧪 (Mago)

ward, который в том числе умеет запускать асинхронные тесты без дополнительных плагинов. Очевидно, автор вдохновлялся pytest, поэтому получилось идейно похоже, но всё-таки иначе в деталях. Мне нравится, надо попробовать!

Forwarded from ∏ρ؃uñçτØρ Øπτµç∑ | 👁🗨››››

Forwarded from Python Daily
from lona.html import HTML, Button, Div, H1
from lona import LonaApp, LonaView
app = LonaApp(__file__)
@app.route('/')
class MyView(LonaView):
def handle_request(self, request):
message = Div('Button not clicked')
button = Button('Click me!')
html = HTML(
H1('Click the button!'),
message,
button,
)
self.show(html)
# this call blocks until the button was clicked
input_event = self.await_click(button)
if input_event.node == button:
message.set_text('Button clicked')
return html
app.run(port=8080)

pip и можно устанавливать пакеты!Pytup 🐍 Привет, питоняги! Pytup уже завтра! Начало в 18-00 по МСК, онлайн. Регистрируйтесь, ссылочка на трансляцию придет вам на почту 🤗 Вова покажет нам как дружить типы и ide 🧬 Надя покажет как она умеет "готовить" мутации 🗞 Напоследок узнаем свежие новости…
Forwarded from Pytup
