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 هذه الميزة.

مصادر ومواصفات