--- title: Math.hypot() slug: Web/JavaScript/Reference/Global_Objects/Math/hypot tags: - ECMAScript6 - JavaScript - Math - Méthode - Reference - polyfill translation_of: Web/JavaScript/Reference/Global_Objects/Math/hypot original_slug: Web/JavaScript/Reference/Objets_globaux/Math/hypot ---
La fonction Math.hypot() renvoie la racine carrée de la somme des carrés de ses arguments. On peut également la définir avec la formule suivante :
Math.hypot([valeur1[,valeur2, ...]])
valeur1, valeur2, ...La racine carrée de la somme des carrés des arguments. S'il existe un des arguments qui ne peut pas être converti en un nombre, c'est la valeur {{jsxref("NaN")}} qui sera renvoyée.
hypot() étant une méthode statique de Math, il faut utiliser Math.et non pas la méthode d'un autre objet qui aurait été créé (hypot()Math n'est pas un constructeur).
Si aucun argument n'est donné, le résultat sera +0.Si, parmi les arguments, au moins un ne peut pas être converti en un nombre, le résultat sera {{jsxref("NaN")}}.Si cette fonction est utilisée avec un argument : Math.hypot(x) sera équivalente à Math.abs(x).
Cette fonction permet entre autres de gérer certains cas où, pour les grands nombres, l'utilisation de {{jsxref("Math.sqrt()")}} aurait renvoyé {{jsxref("Infinity")}} à cause des calculs intermédiaires.
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, "toto") // NaN, +"toto" => NaN Math.hypot(3, 4, "5") // 7.0710678118654755, +"5" => 5 Math.hypot(-3) // 3, the same as Math.abs(-3)
Si elle n'est pas disponible, cette fonction peut être émulée de la façon suivante :
Math.hypot = Math.hypot || function() {
var y = 0;
var length = arguments.length;
for (var i = 0; i < length; i++) {
if(arguments[i] === Infinity || arguments[i] === -Infinity) {
return Infinity;
}
y += arguments[i] * arguments[i];
}
return Math.sqrt(y);
};
Voici une seconde version qui évite les dépassements :
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);
};
| Spécification | État | Commentaires |
|---|---|---|
| {{SpecName('ES2015', '#sec-math.hypot', 'Math.hypot')}} | {{Spec2('ES2015')}} | Définition initiale |
| {{SpecName('ESDraft', '#sec-math.hypot', 'Math.hypot')}} | {{Spec2('ESDraft')}} |
{{Compat("javascript.builtins.Math.hypot")}}