Переклад цієї статті ще триває.

Функція 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  

Сумісність із браузерами

FeatureChromeEdgeFirefoxInternet ExplorerOperaSafari
Basic support38 Yes27 No258
FeatureAndroid webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
Basic support Yes Yes Yes27 Yes8 Yes

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

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

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