--- 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 :
Le code source de cet exemple interactif est disponible dans un dépôt GitHub. Si vous souhaitez contribuez à ces exemples, n'hésitez pas à cloner https://github.com/mdn/interactive-examples et à envoyer une pull request !
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")}}