Очікує на перевірку

Hypot

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

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

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

[ред. | ред. код]

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

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

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

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

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

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

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

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

Втілення

[ред. | ред. код]

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

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

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

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

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