Hypot

Матеріал з testwiki
Версія від 05:55, 30 травня 2024, створена imported>Tolsai (growthexperiments-addlink-summary-summary:1|1|0)
(різн.) ← Попередня версія | Поточна версія (різн.) | Новіша версія → (різн.)
Перейти до навігації Перейти до пошуку

Шаблон:Short description Hypot — це математична функція для обчислення довжини гіпотенузи прямокутного трикутника. Її було розроблено, щоб уникнути помилок, що виникають через обмежену точність обчислень, що їх виконують на комп'ютерах.

Мотивація і використання

Обчислення довжини гіпотенузи трикутника можливе застосуванням квадратного кореня до сумі двох квадратів, але hypot(xy) уникає проблем з піднесенням до квадрату дуже великих і дуже маленьких чисел.

Довжина гіпотенузи від (0, 0) до (xy) можна обчислити використовуючи

r=x2+y2.

Цю операцію знають як теореми Піфагора.

Однак, під час обчислень на комп'ютері, квадрати дуже великих чи маленьких значень x і y можуть вийти за межі машинної точності, що призводить до неточного результату спричиненого переспорожнінням і/або переповненням. Функцію hypot було розроблено, щоб отримувати результат не маючи такої проблеми.

Функцію hypot часто використовують разом із функцією Шаблон:Не перекладено для переведення з декартових у полярні координати:

r = hypot(xy),
θ = atan2(yx).

Якщо якійсь із входів це нескінченність, то вислід це теж нескінченність.

hypot(x, ±∞) = hypot(±∞, x) = +∞

Втілення

Вада наївного втілення в тому, що x2 або y2 може переспрожнітись чи переповнитись, хіба що ми використаємо Шаблон:Не перекладено. Загальноприйнята техніка це, якщо потрібно, то обміняти значення так, щоб |x| ≥ |y| і тоді використати рівнозначну форму

r=x2+y2=x2(1+(yx)2)=|x|1+(yx)2(=|x|+y|x|y1+1+(yx)2).

Обчислення y/x не може переповнитись, хіба що і x, і y це 0. Якщо y/x переспорожняється, то кінцевий результат рівний |x|, що правильно в межах точності обчислення. Квадратний корінь треба обчислити для значення між 1 і 2. Зрештою, множення на |x| не може переспорожніти і переповнюється лише, якщо результат занадто великий.

Цей підхід вимагає додаткового ділення чисел з рухомою комою, що може подвоїти ціну в порівнянні з наївним втіленням, бо множення і додавання значно швидші ніж ділення і взяття кореня.

Складніші втілення уникають цього розбиванням можливих входів на більше випадків:

  • xy: hypot(x, y) = |x|, з точністю до машинного епсилон.
  • x2 переповнюється: помножити x і y на маленький масштабувальний множник (наприклад, 2−64 для одинарної точності IEEE), використати наївний алгоритм, який не переповниться і помножити результати на обернене до масштабувального множника (наприклад, 264).
  • y2 переспорожняється: Як вище, але обернути масштабувальний множник, щоб збільшити проміжні значення.
  • Інакше: можна безпечно використати наївний алгоритм.