group-telegram.com/misha_writes_code/195
Last Update:
Наткнулся на видос, где рассказывают, какие неочевидные проблемы могут возникнуть при поиске среднего двух чисел:
https://www.youtube.com/watch?v=sBtAGxBh-XI
Удивительно, что доклад на такую, казалось бы, простую тему может длиться час. Но там действительно огромное поле для ошибок.
При написании алгоритма поиска среднего велик соблазн сделать просто return (a + b) / 2
, однако такая реализация может переполниться и привести к неопределенному поведению.
Ровно из-за такой ошибки в Java 9 лет некорректно работал бинпоиск. Аналогичная проблема была и в имплементации JS от Mozilla.
Помимо переполнения есть еще другие сложности: integer promotion при работе с short
, зависящий от имплементации знак у char
. Ловушки в специализации шаблонов. А кроме целых типов ведь есть еще флоты и указатели, с которыми тоже приколов хватает.
Если лень смотреть, то есть документ с описанием имплементации std::midpoint,
на основе которого и был сделан доклад (тут не все, но все равно есть, что почитать):
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0811r3.html
Также можно глянуть итоговую имплементацию std::midpoint
:
https://github.com/llvm/llvm-project/blob/main/libcxx/include/__numeric/midpoint.h
BY Миша пишет код
Share with your friend now:
group-telegram.com/misha_writes_code/195