Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску

Гипотензия - это математическая функция, предназначенная для вычисления длины гипотенузы прямоугольного треугольника. Он был разработан, чтобы избежать ошибок, возникающих из-за вычислений с ограниченной точностью, выполняемых на компьютерах.

Мотивация и использование [ править ]

Вычислить длину гипотенузы треугольника можно с помощью функции извлечения квадратного корня из суммы двух квадратов, но гипотеза ( xy ) позволяет избежать проблем, возникающих при возведении в квадрат очень больших или очень малых чисел.

Величину гипотенузы от (0, 0) до ( xy ) можно вычислить с помощью

Эта операция также известна как сложение Пифагора .

Тем не менее, квадраты очень больших или малых значений х и у могут превышать диапазон машинной точности при расчете на компьютере, что приводит к неверному результату , вызванной арифметической сгущенного и / или арифметического переполнения . Функция гипотезы была разработана, чтобы вычислить результат, не вызывая этой проблемы.

Функция гипотезы часто используется вместе с функцией atan2 для преобразования декартовых координат в полярные координаты :

г = гипотеза ( ху ),
θ = atan2 ( yx ).

Если любой вход бесконечен, результат будет бесконечным, т. Е.

гипотеза ( x , ± ∞) = гипотеза (± ∞, x ) = + ∞

Поскольку это верно для всех возможных значений х , в том числе бесконечности, IEEE 754 стандарт с плавающей точкой требует , чтобы это определение также применимо , если х это не является числом (NaN). [1]

Реализация [ править ]

Сложность наивной реализации состоит в том, что x 2 или y 2 могут быть переполнены или не заполнены, если промежуточный результат не вычислен с повышенной точностью . Распространенным методом реализации является при необходимости обмен значениями, чтобы | х | ≥ | y |, а затем использовать эквивалентную форму [2]

Вычисление y / x не может быть переполнено, если оба x и y не равны 0. Если y / x не переполняется , окончательный результат будет равен | x |, что верно в пределах точности вычисления. Квадратный корень вычисляется из значения от 1 до 2. Наконец, умножение на | х | не может быть недостаточным и переполняется только тогда, когда результат слишком велик для представления.

У этой реализации есть обратная сторона: требуется дополнительное деление с плавающей запятой, что может удвоить стоимость наивной реализации, поскольку умножение и сложение обычно намного быстрее, чем деление и извлечение квадратного корня.

Более сложные реализации избегают этого, разделяя входные данные на большее количество случаев:

  • xy : гипотеза ( x , y ) = | x | с точностью до машинной точности .
  • x 2 переполнения: умножьте и x, и y на небольшой коэффициент масштабирования (например, 2 −64 для одинарной точности IEEE), используйте наивный алгоритм, который теперь не будет переполняться, и умножьте результат на (большой) обратный (например, 2 64 ) .
  • y 2 потери значимости: То же, что и выше, но измените коэффициенты масштабирования для увеличения промежуточных значений.
  • В противном случае: использование наивного алгоритма безопасно.

Дополнительные методы позволяют вычислить результат более точно, например, до менее одного ulp . [3]

Поддержка языков программирования [ править ]

Функция присутствует на нескольких языках программирования:

См. Также [ править ]

  • Алгоритм Alpha max плюс beta min , более быстрый алгоритм, дающий приблизительный результат

Ссылки [ править ]

  1. ^ Туман, Агнер (2020-04-27). «Отслеживание исключений с плавающей запятой и распространение NAN» (PDF) . п. 6. CS1 maint: discouraged parameter (link)
  2. ^ В некоторых ситуациях последняя форма сокращает ошибки вычислений (в ULP ).
  3. Борхес, Карлос Ф. (14 июня 2019 г.). «Улучшенный алгоритм для гипотезы (а, б)». arXiv : 1904.09481 [ math.NA ].
  4. ^ Чимпану, Каталин. «CSS для поддержки функций тригонометрии» . ZDNet . Проверено 1 ноября 2019 .
  5. ^ http://www.cplusplus.com/reference/cmath/hypot/
  6. ^ https://dlang.org/phobos/std_math.html#.hypot
  7. ^ https://docs.julialang.org/en/v1/base/math/#Base.Math.hypot
  8. ^ https://docs.python.org/3/library/math.html#math.hypot
  9. ^ https://developer.apple.com/DOCUMENTATION/mac/PPCNumerics/PPCNumerics-141.html
  10. ^ http://nl.mathworks.com/help/matlab/ref/hypot.html
  11. ^ http://www.frameworkpascal.com/helphtml/hypot_func.htm
  12. ^ http://www.php.net/hypot
  13. ^ http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Math.html#hypot(double,%20double)
  14. ^ "гипотеза - язык программирования Котлин" . Котлин . Проверено 19 марта 2018 .
  15. ^ http://ruby-doc.org/core/Math.html#method-c-hypot
  16. ^ http://golang.org/pkg/math/#Hypot
  17. ^ https://doc.rust-lang.org/std/primitive.f64.html#method.hypot
  18. ^ https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/hypot
  19. ^ Единая спецификация Unix, открытая группа, http://www.opengroup.org/onlinepubs/007908799/xsh/hypot.html
  20. ^ IBM, Функции библиотеки времени выполнения ILE C / C ++, http://publib.boulder.ibm.com/infocenter/iadthelp/v7r0/index.jsp?topic=/com.ibm.etools.iseries.langref.doc/ rzan5mst144.htm
  21. ^ Библиотека GNU C, математика, http://www.cs.utah.edu/dept/old/texinfo/glibc-manual-0.02/library_17.html Архивировано 5 марта2009 г. на Wayback Machine
  22. ^ https://www.scala-lang.org/api/current/scala/math/index.html#hypot(x:Double,y:Double):Double