Каковы все возможные расчеты, которые могут вызвать NaN в Python?

Я искал вокруг, и, по-видимому, разбросанные дискуссии о NaN на разных языках программирования, включая некоторые конкретные случаи, но ничего исчерпывающего или ясного.

Каковы наиболее распространенные операции, которые могут вызвать NaN в Python, которые возникают при работе с NumPy или SciPy?

  • urllib2.urlopen не может получить изображение, но браузер может
  • Почему этот код argparse ведет себя по-разному между Python 2 и 3?
  • Создание прямоугольника для перемещения по экрану с помощью графического файла
  • как мне сопоставить словарь, а не список?
  • Использование более старого Python 2.x с одновременным использованием Python 2.x и 3.x в Windows
  • передавать и получать значения между скриптом python и applescript
  • Установка позиции на кнопке в Python?
  • Преобразование datetime.datetime объекта в дни с эпохи в Python
  • One Solution collect form web for “Каковы все возможные расчеты, которые могут вызвать NaN в Python?”

    Если вы выполняете любое из следующих действий без обхода среды с плавающей точкой, вы должны получить NaN, где у вас его не было:

    • 0/0 (либо знак сверху и снизу)
    • inf/inf (либо знак сверху и снизу)
    • inf - inf или (-inf) + inf или inf + (-inf) или (-inf) - (-inf)
    • 0 * inf и inf * 0 (либо знак на обоих факторах)
    • sqrt(x) когда x < 0
    • fmod(x, y) когда y = 0 или x бесконечно; здесь fmod является остатком с плавающей запятой.

    Каноническая ссылка для этих аспектов машинной арифметики – это спецификация IEEE 754 . В разделе 7.1 описано исключение недействительной операции, которое возникает, когда вы собираетесь получить NaN. «Исключение» в IEEE 754 означает нечто иное, чем в контексте языка программирования.

    Многие реализации специальных функций документируют свое поведение в особенностях функции, которую они пытаются реализовать. Например, смотрите страницу man atan2 и log .

    Вы спрашиваете конкретно о NumPy и SciPy. Я не уверен, просто ли это сказать: «Я спрашиваю об арифметике машины, которая происходит под капотом в NumPy» или «Я спрашиваю о eig() и т. Д.». Я предполагаю, что первый, но остальная часть этого ответа пытается смутно подключиться к функциям более высокого уровня в NumPy. Основное правило: если реализация функции совершает один из вышеуказанных грехов, вы получаете NaN.

    Например, для 1e1010 вы можете получить NaN s, если ваши входные значения составляют около 1e1010 или больше и тихая потеря точности, если ваши входные значения составляют около 1e-1010 или меньше. Тем не менее, помимо действительно смехотворно масштабируемых входов, вы совершенно безопасны с fft .

    Для вещей, связанных с матричной математикой, NaN могут возникать (как правило, через inf - inf маршрут), если ваши цифры огромны или ваша матрица крайне плохо обусловлена. Полное обсуждение того, как вы можете ввернуться в числовую линейную алгебру, слишком долго, чтобы принадлежать в ответ. Я предлагаю перечислить числовую книгу линейной алгебры (Trefethen и Bau популярен) в течение нескольких месяцев.

    Одна вещь, которую я нашел полезной при написании и отладке кода, который «не должен» генерировать NaN, заключается в том, чтобы сказать, что машина ловутся, если происходит NaN. В GNU C я делаю следующее:

     #include <fenv.h> feenableexcept(FE_INVALID); 
    Python - лучший язык программирования в мире.