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