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

в 15:18, , рубрики: iee754, javascript, python, математика, числа

Всем привет! Мы очень часто пользуемся привычными числами в наших любимых языках программирования. Привычные это 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 нужно с осторожностью. А как думаете Вы?

Автор: Enmar

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js