--- title: Math.imul() slug: Web/JavaScript/Reference/Global_Objects/Math/imul tags: - JavaScript - Math - imul - Довідка - метод translation_of: Web/JavaScript/Reference/Global_Objects/Math/imul ---
{{JSRef}}

Функція Math.imul() повертає результат C-подібного 32-бітного множення двох аргументів.

{{EmbedInteractiveExample("pages/js/math-imul.html")}}

Синтаксис

var product = Math.imul(a, b);

Аргументи

a
Перше число.
b
Друге число.

Результат

Результат C-подібного 32-бітного множення даних аргументів.

Опис

Math.imul() дає можливість виконувати 32-бітне цілочисельне множення з C-подібною семантикою. Ця особливість дуже корисна для проектів на зразок Emscripten.

У зв'язку з тим, що imul() - це статичний метод Math, слід завжди викликати його як Math.imul(), аніж як метод створеного вами об'єкту Math (оскільки Math не являється конструктором).

Якщо ви використаєте звичайні числа із рухомою комою в imul, ви отримаєте значну деградацію продуктивності. Причина криється у доволі коштовній з точки зору ресурсів конвертації числа із рухомою комою у ціле для виконання множення, і зворотній конвертації результату. imul() існує у зв'язку із тим, що він швидший у єдиному (поки що) випадку: застосування у AsmJS. AsmJS дозволяє JIST-оптимізаторам простіше реалізовувати цілі числа всередині у JavaScript. Множення двох чисел, що уже зберігаються як цілі (що, поки що, можливо лише з AsmJS) за допомогою imul - це єдина потенційна можливість для Math.imul покращити продуктивність у сучасних браузерах.

Приклади

Застосування Math.imul()

Math.imul(2, 4);          // 8
Math.imul(-1, 8);         // -8
Math.imul(-2, -2);        // 4
Math.imul(0xffffffff, 5); // -5
Math.imul(0xfffffffe, 5); // -10

Поліфіл

Цей метод може бути реалізований за допомогою наступної функції:

Math.imul = Math.imul || function(a, b) {
  var aHi = (a >>> 16) & 0xffff;
  var aLo = a & 0xffff;
  var bHi = (b >>> 16) & 0xffff;
  var bLo = b & 0xffff;
  // зсув на 0 фіксує знак старшої частини
  // |0 наприкінці перетворює беззнакове значення у число із знаком
  return ((aLo * bLo) + (((aHi * bLo + aLo * bHi) << 16) >>> 0) | 0);
};

Специфікації

Специфікація Статус документу Примітка
{{SpecName('ES6', '#sec-math.imul', 'Math.imul')}} {{Spec2('ES6')}} Первинне визначення.
{{SpecName('ESDraft', '#sec-math.imul', 'Math.imul')}} {{Spec2('ESDraft')}}  

Підтримка у браузерах

{{Compat("javascript.builtins.Math.imul")}}