#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