int(math.ceil(i/2)) == (i+1)//2
в цикле по натуральным числам?
Насколько я это понимаю (даже учитывая погрешность плавующей точки) при делении нечетных чисел пополам, округление будет идти вверх корректно в любом случае:
math.ceil(0.49…..9) == math.ceil(0.5…..01) == 1
А при делении четных чисел, питон не должен аффектиться погрешностью плавающей точки - условно 4/2, да, вернет float, но никогда не вернет 2.00….1, потому что там негде взяться погрешности -> никогда не округлится вверх -> тоже эквивалентно.
Или?
1. math.ceil(i/2) округляет результат деления i на 2 вверх до ближайшего целого числа. 2. (i+1)//2 добавляет 1 к i и затем делит на 2, используя целочисленное деление. Если i нечетное, тогда (i+1)//2 просто добавляет 1 перед делением на 2, что эквивалентно округлению вверх. Например, для i = 3, оба выражения дают 2. Если i четное, оба выражения просто делят i на 2. Например, для i = 4, оба выражения дают 2. (c) GPT-4
Последний абзац вскоре всего неправда, можете почитать статью "Floating Point Arithmetic: Issues and Limitations" в доках питона (сообщение со ссылкой почему-то удалилось 🤷) И дело тут не особо в питоне, а в том, как работает IEEE 754
В свое время 754-й п перелопатил вдоль и поперек, но не помню проблем с делением именно на двойку.
Так ее может и нет)) я хз
Я +- об этом говорил, сейчас освежил в памяти, спасибо. Мой поинт наверное можно переформулировать как - для деления, когда результат - натуральное число, разве в IEEE 754 не будет возвращаться одно и то же, т.к. дробной части нет и как следствие - нет пространства для ошибки? Просто кажется что питон не должен так себя вести.
Тогда ждем дальше 😄😄😄
При делении натуральных чисел на 2 погрешности не будет, будет ровно .5 в случае нечетных, поэтому math.ceil всегда будет округлять корректно. Это естественно если мы говорим за питон 3, потому что во 2-ом было бы по другому, т.к. 9/2 = 4, а 9/2.0 = 4.5
Обсуждают сегодня