Функція Math.hypot() повертає квадратний корінь від суми квадратів поданих аргументів

Math.hypot(v1,v2,,vn)=i=1nvi2=v12+v22++vn2\mathtt{\operatorname{Math.hypot}(v_1, v_2, \dots, v_n)} = \sqrt{\sum_{i=1}^n v_i^2} = \sqrt{v_1^2 + v_2^2 + \dots + v_n^2}

Синтаксис

Math.hypot([value1[, value2[, ...]]])

Аргументи

value1, value2, ...
Числа.

Результат

Квадратний корінь від суми квадратів поданих аргументів. Якщо хоча б один з аргументів не може бути приведений до числа - результатом буде NaN.

Опис

Обчислення гіпотенузи прямокутного трикутника чи модуля комплексного числа відбувається за формулою Math.sqrt(v1*v1 + v2*v2), де v1 та v2 - це катети прямокутного трикутника, або ж дійсна та уявна частини комплексного числа.  Для обчислення відстані у двох, чи більше вимірах, варто просто додати більше квадратів під знак кореня, наприклад: Math.sqrt(v1*v1 + v2*v2 + v3*v3 + v4*v4).  

Ця ж функція дозволяє робити це швидше і простіше, варто просто викликати Math.hypot(v1, v2) чи Math.hypot(v1, v2, v3, v4, ...).

Вона також дозволяє уникнути проблеми у випадках, коли гіпотенуза ваших чисел дуже велика.  Найбільше число, яке ви можете зобразити за допомогою чисел подвійної точності у JS - це Number.MAX_VALUE = 1.797...e+308 .  Якщо ваші вхідні числа більші за 1e154, спроба піднести їх до квадрату у результаті дасть Infinity, що повністю зруйнує результат.  Тобто, Math.sqrt(1e200*1e200 + 1e200*1e200) = Infinity .  Якщо ж ви натомість застосуєте hypot(), ви отримаєте цілком нормальний результат Math.hypot(1e200, 1e200) = 1.4142...e+200 .  Це також справедливо для дуже малих чисел.  Math.sqrt(1e-200*1e-200 + 1e-200*1e-200) = 0, але Math.hypot(1e-200, 1e-200) =1.4142...e-200, тобто цілком корисний результат.

Оскільки hypot() - це статичний метод об'єкту Math, він завжди використовується як Math.hypot(), а не як метод створеного об'єкту Math  (Math не є конструктором).

У випадку, якщо функція викликається без аргументів, результатом є +0.

А якщо хоча б один з аргументів не може бути зведеним до числа, в результаті отримаємо NaN.

Якщо дано лише один аргумент, Math.hypot() повертає такий самий результат, як і Math.abs().

Приклади

Застосування Math.hypot()

Math.hypot(3, 4);        // 5
Math.hypot(3, 4, 5);     // 7.0710678118654755
Math.hypot();            // 0
Math.hypot(NaN);         // NaN
Math.hypot(3, 4, 'foo'); // NaN, +'foo' => NaN
Math.hypot(3, 4, '5');   // 7.0710678118654755, +'5' => 5
Math.hypot(-3);          // 3, the same as Math.abs(-3)

Поліфіл

Цей функціонал можна легко повторити ось такою функцією:

Math.hypot = Math.hypot || function() {
  var y = 0, i = arguments.length;
  while (i--) y += arguments[i] * arguments[i];
  return Math.sqrt(y);
};

Більш складний варіант, який дозволяє уникнути описаних вище проблем виходу за межі точності числового формату:

Math.hypot = function (x, y) {
  // https://bugzilla.mozilla.org/show_bug.cgi?id=896264#c28
  var max = 0;
  var s = 0;
  for (var i = 0; i < arguments.length; i += 1) {
    var arg = Math.abs(Number(arguments[i]));
    if (arg > max) {
      s *= (max / arg) * (max / arg);
      max = arg;
    }
    s += arg === 0 && max === 0 ? 0 : (arg / max) * (arg / max);
  }
  return max === 1 / 0 ? 1 / 0 : max * Math.sqrt(s);
};

Специфікації

Специфікація Статус документу Примітка
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Math.hypot' in that specification.
Standard Первинне визначення.
ECMAScript Latest Draft (ECMA-262)
The definition of 'Math.hypot' in that specification.
Draft  

Підтримка у браузерах

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidEdge MobileFirefox for AndroidOpera for AndroidiOS SafariSamsung InternetNode.js
Basic supportChrome Full support 38Edge Full support YesFirefox Full support 27IE No support NoOpera Full support 25Safari Full support 8WebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 27Opera Android Full support YesSafari iOS Full support 8Samsung Internet Android Full support Yesnodejs Full support 0.12

Legend

Full support  
Full support
No support  
No support

Дивіться також

Мітки документа й учасники

Зробили внесок у цю сторінку: AdriandeCita
Востаннє оновлена: AdriandeCita,