Безопасно ли предполагать, что atan2 (0,0) возвращает 0?

#python #c #atan2

#python #c #atan2

Вопрос:

Похоже, что atan2(0,0) в C это определено таким образом. Python просто делегирует общие тригонометрические функции базовой реализации C, верно?

Ответ №1:

В документах Python явно не указано atan2(0, 0), но в реализации CPython прилагаются особые усилия, чтобы гарантировать, что особые случаи соответствуют C99, даже если базовая библиотека C этого не делает. Сюда входит путь к коду, который обрабатывает, чтобы atan2 (0, 0) возвращал 0.0:

 if (Py_IS_INFINITY(x) || y == 0.) {
    if (copysign(1., x) == 1.)
        /* atan2( -y,  inf) = atan2( -0,  x) =  -0. */
        return copysign(0., y);
    ...
  

В общем, функции, предоставляемые в math модуле, которые соответствуют функциям стандартной библиотеки C, должны соответствовать стандартному поведению C. На этот счет есть несколько общих инструкций, например, эта в верхней части документации:

Этот модуль всегда доступен. Он предоставляет доступ к математическим функциям, определенным стандартом C.

и это внизу:

Поведение в исключительных случаях соответствует приложению F стандарта C99, где это уместно.

хотя приложение F не является частью стандарта, который определяет atan2.

Комментарии:

1. Спасибо. Я действительно имел в виду CPython, другие различные реализации не соответствуют моим потребностям.

Ответ №2:

Как сказал @user2357112, в документах это не указано. Если вам нужно что-то хорошо документированное — используйте numpy.arctan2 — см. Раздел Примечания в https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.arctan2.html