Всем привет! Мы очень часто пользуемся привычными числами в наших любимых языках программирования. Привычные это 1, -1.5, pi или даже комплексные. А вот NaN, +Inf, -Inf используется нами гораздо реже.
Примечание:
В статье я использую элементарные функции Python версии 3.6.8, но многое будет актуально и для других языков, например для JS.
Вообще неопределенных ситуаций в математике достаточно много. Например, это деление на 0.
Введя в консоли
1/0
Вы получите ошибку ZeroDivisionError. Ожидаемо, скажите Вы? Да. Давайте попробуем другой пример:
0**0
Как известно, 0 в степени 0 это классическая математическая неопределенность.
Однако Питон говорит, что это 1. Возникает резонный вопрос:
Почему нам не дают «выстрелить в ногу» с делением на 0, но сообщают неверный результат при таком неопределенном действии?
Возможно, кто-то прямо сейчас негодует и кричит, что ответ прост: IEEE 754. И если я не ошибаюсь именно с его помощью договорились, что любое число в степени 0 это 1.
Вот тут начинается самое интересное. JavaScript тоже поддерживает IEEE (0.1+0.2!=0.3), но в нем 1/0 это бесконечность, а не ошибка деления на 0.
В итоге, мы имеем (все примеры для python):
1. Выброс ошибки при некорректных действиях
Примеры:
1/0 # ZeroDivisionError
log(0) #ValueError
2. Возврат неправильных значений
Пример:
0**0 #1
1**inf #1.0
3. Возврат специальных значений:
+-Inf, nan
Пример:
inf=float('inf')
inf-inf #nan
На мой взгляд это вносит путаницу.
Буквально сегодня заметил интересное поведение PHP:
var_dump(mt_rand(INF,INF)); //случайное между INF и INF - NULL??
//При этом функция должна возвращать только числа и false.
Я категорически против 2 варианта и поддерживаю, наверное, 1.
Потому что, как показывает пример с PHP, использовать inf и nan нужно с осторожностью. А как думаете Вы?
Автор: Enmar