Математические неопределенности на примере 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 нужно с осторожностью. А как думаете Вы?
    • +11
    • 4.3k
    • 6
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 6

      +3
      null
        0
        Что?
        Причем null?
        +1
        Ну не знаю, случаи когда действительно были важны такие заморочки как +inf, -inf, +0 и -0, могу пересчитать по пальцам одной руки фрезеровщика с эквивалентным моему опыту программиста. Что касается Python и таких «неопределенностей», то NumPy вам в помощь.
          0

          Когда пишешь или прототипируешь математику — оптимизатор например, то все это очень даже надо.

          0

          Классические скриптовые языки (shell, bash, tcl ) просто говорят, что это деление на ноль.
          tcl:


          % expr 1 / 0
          divide by zero
          %

          bash:


          $ expr 1 % 0
          expr: деление на ноль
          $
            0

            Вот тут автор пытается объяснить, почему 0 в 0 степени равен 1
            https://youtu.be/7cQ5n9j5Guo

            Only users with full accounts can post comments. Log in, please.