Еще вспомнил как-то недавно (потому что опять напругу вырубают). Объявления вроде "света не будет с 1400 до 1800". Как же это адски бесит! Ну ёлы-палы! В 1800 уже будет свет? Или в 1801 он будет? А в 1759?
Есть крайне простой способ бороться с такими ошибками -- раз и навсегда познать закрытые, полу-открытые и открытые интервалы. Что дичайше полезно для любого программера. Тогда указываем: "света не будет в [1400-1759]" (закрытый интервал). Потому что на практике обыкновенно подразумевается, что в 1800 свет включат. Можно также переписать: "света не будет в [1400-1800)" (полу-открытый интервал) -- выглядит красивее, но в бытовом языке будет еще больше путаницы.
От обычных людей не стоит ожидать знаний такой (довольно легкой, кстати) математики, но они выкручиваются тем, что добавляют слово "включительно" (и получается закрытый интервал). Т.е., обычные люди могут сказать (и понять сказанное) "света не будет с 1400 по 1759 включительно". Это уже намного лучше. Такие люди для меня всегда рукопожатные!
Кстати, в [1999-2000] спорили, когда именно начинается 3-е тысячелетие. И когда, собственно, нужно праздновать "линолиум". Эти споры тоже касаются этого типа ошибки. (Впрочем, мне самому в то время было пофик, когда праздновать "линолиум", как и сейчас.)
И еще.
Если помнить, где какие интервалы вы юзаете, часть этих ошибок можно избежать.
И как тут не вспомнить Э.Дейкстру! (Он был за полу-открытые интервалы в циклах.)
Пример еще. Если ваш рейтинг в uber/glovo/uklon 4.8, то на самом деле он [4.75, 4.85], из-за округления:
% python3 >>> "%1.1f" % 4.75 '4.8' >>> "%1.1f" % 4.85 '4.8' >>> "%1.1f" % 4.849999999999 '4.8' >>> "%1.1f" % 4.850000000001 '4.9'
А вот еще пример. Семейный фотоальбом на котором бирка -- "2020-2024" (в смысле, годы). Когда в бытовой жизни пишут такой интервал, преполагается, что он закрытый, т.е., от 2020-го года до 2024-го, включительно. А теперь быстро ответьте на вопрос, сколько лет внутри этого интервала? Так и хочется быстро подсчитать 2024-2020=4, но это неверный ответ. Внутри этого закрытого интервала 5 лет: 2020-й, 2021-й, 2022-й, 2023-й, 2024-й. Так возникают ошибки заборного столба.
Усилиями Э.Дейкстры, в программинге чаще юзаются полу-закрытые интервалы, чем закрытые. И наверное вот это и есть причина ошибок заборного столба --- в бытовой речи всё же закрытые интервалы юзаются чаще --- "за вечер выпиваю от 4 до 6 банок пива", "надо купить 10-15 яиц", и т.д.
Если каждый раз задумываться об этом, когда пишете цикл, баг будет немного меньше.
Открытые интервалы в программинге юзаются редко, но бывает.
Например, делить на ноль и на бесконечность нельзя, так что доступные делители в одном из двух интервалов: (-inf, 0) и (0, +inf). Так мы включаем в интервал какие угодно маленькие числа, но не ноль. И какие угодно большие числа, но не бесконечность.
Также, если какое угодно число делить на x>0, бесконечное кол-во раз, результат стремится к нулю, и он тоже будет в одном из этих интервалов, но нулем никогда не станет (при условии отсутствия underflow).
Yes, I know about these lousy Disqus ads. Please use adblocker. I would consider to subscribe to 'pro' version of Disqus if the signal/noise ratio in comments would be good enough.