Функція Math.imul()
повертає результат C-подібного 32-бітного множення двох аргументів.
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Джерело цих інтерактивних прикладів зберігається у репозиторії на GitHub. Якщо ви маєте бажання зробити свій внесок у проект інтерактивних прикладів - будь ласка, зклонуйте репозиторій https://github.com/mdn/interactive-examples та пришліть нам pull request.
Синтаксис
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);
};
Специфікації
Специфікація | Статус документу | Примітка |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) The definition of 'Math.imul' in that specification. |
Standard | Первинне визначення. |
ECMAScript (ECMA-262) The definition of 'Math.imul' in that specification. |
Living Standard |
Підтримка у браузерах
BCD tables only load in the browser
Таблиця сумісності на цій сторінці сформована автоматично із структурованих даних. Якщо ви маєте бажання зробити свій внесок до цих даних - будь-ласка, ось репозиторій https://github.com/mdn/browser-compat-data, надішліть нам свій pull request.