Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Если вы выполняете любое из следующих действий без обхода среды с плавающей точкой, вы должны получить 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 означает нечто иное, чем в контексте языка программирования.

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

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

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

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

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

#include <fenv.h>
feenableexcept(FE_INVALID);