Math.hypot()
الدالة Math.hypot()
تعيد الجذر التربيعي لمجموع مربعات الوسائط المُمرَّرة إلى الدالة. أي:
Math.hypot(v1, v2, ... , vn) = sqrt(v1^2 + v2^2 + ... + vn^2)
البنية العامة
Math.hypot([value1[, value2[, ...]]])
value1, value2, ...
الأعداد التي ستُجرى عليها العملية.
القيمة المعادة
الجذر التربيعي لمجموع مربعات الوسائط المُمرَّرة إلى الدالة، وإذا لم لكن بالإمكان تحول وسيط واحد على الأقل إلى رقم فستُعاد القيمة NaN
.
الوصف
تساعد هذه الدالة في الحسابات الرياضية، مثل إيجاد طول وتر مثلث (فبدلًا من استخدام الدالة Math.sqrt(v1*v1 + v2*v2)
حيث v1
و v2
هما طولا جانبا المثلث، ستُبسِّط هذه الدالة من الصيغة وتسمح لنا بكتابة Math.hypot(v1, v2)
).
تحل هذه الدالة مشكلة الأعداد الكبيرة، فأكبر عدد يمكن تمثيله في 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
هي دالةٌ ساكنة (static method) تابعةٌ للكائن 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);
};
الشيفرة الآتية تتفادى حدوث overflow أو underflow:
Math.hypot = function (x, y) {
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);
};
دعم المتصفحات
الميزة | Chrome | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
الدعم الأساسي | 38 | 27 | غير مدعومة | 25 | 8 |
على النقيض من المتصفح IE، يدعم متصفح Edge هذه الميزة.
مصادر ومواصفات
- مسودة المعيار ECMAScript Latest Draft.
- معيار ECMAScript 2015 (6th Edition).