Как стать автором
Обновить

Математические неопределенности на примере Python

Время на прочтение2 мин
Количество просмотров7.4K
Всем привет! Мы очень часто пользуемся привычными числами в наших любимых языках программирования. Привычные это 1, -1.5, pi или даже комплексные. А вот NaN, +Inf, -Inf используется нами гораздо реже.

Примечание:

В статье я использую элементарные функции Python версии 3.6.8, но многое будет актуально и для других языков, например для JS.

Вообще неопределенных ситуаций в математике достаточно много. Например, это деление на 0.
Введя в консоли

1/0

Вы получите ошибку ZeroDivisionError. Ожидаемо, скажите Вы? Да. Давайте попробуем другой пример:

0**0

Как известно, 0 в степени 0 это классическая математическая неопределенность.
Однако Питон говорит, что это 1. Возникает резонный вопрос:

image

Почему нам не дают «выстрелить в ногу» с делением на 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 нужно с осторожностью. А как думаете Вы?
Теги:
Хабы:
Всего голосов 27: ↑19 и ↓8+11
Комментарии6

Публикации

Истории

Работа

Python разработчик
193 вакансии
React разработчик
84 вакансии
Data Scientist
104 вакансии

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
24 сентября
Astra DevConf 2024
МоскваОнлайн
25 сентября
Конференция Yandex Scale 2024
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн