Целочисленный модуль умножения 2³² в ActionScript 3

Кто-нибудь встречал авторитетную спецификацию того, как арифметические операции с int и uint работают в ActionScript 3? ( Под «авторитетным» я подразумеваю либо «исходит от Adobe», либо «был объявлен авторитетным Adobe»). В частности, я ищу поддерживаемый способ выполнения целочисленного умножения по модулю 2 32 . Это не описано в любой документации Adobe, которую мне удалось найти.

ActionScript утверждает, что основан на ECMAScript, но ECMAScript вообще не выполняет целочисленную арифметику. Он делает все на IEEE-754, удваивает и уменьшает результат по модулю 2 32 перед побитовыми операциями, что в большинстве случаев имитирует целочисленную арифметику. Однако это не работает для умножения: истинный результат умножения, скажем, 0x10000001 * 0x0FFFFFFF будет слишком длинным для мантисса двойного, поэтому младшие биты будут потеряны, если спецификация следует до буквы.

Теперь введите ActionScript. Я обнаружил экспериментально , что умножение двух переменных int или uint и немедленное преобразование продукта в int или uint всегда, кажется, дает мне точный результат. Однако сгенерированный байт-код AVM2 просто содержит простую команду "mul" без прямого указания того, что она должна давать целочисленный результат, а не результат с плавающей запятой; виртуальной машине придется смотреть вперед, чтобы узнать это. Я беспокоюсь, что мне просто повезло в моих экспериментах и ​​я получил дополнительную точность в качестве бонуса, а не то, на что я могу положиться.

(Во-первых, все мои эксперименты проводились с использованием проигрывателя Flash x86. Возможно, это представляет промежуточные результаты, так как 80-битный Intel удваивает или сохраняет 64-битное int в оценочном стеке до тех пор, пока не станет известно, для чего он будет использоваться. Ни то, ни другое было бы легко невозможно на планшете без x86 без собственного 32 × 32 → 64 инструкция умножения, так что может виртуальная машина просто решит снизить точность до того, что указано в стандарте ECMAScript?)

24-часовой статус: Майк Уэлш провел небольшое расследование и предоставил очень полезные ссылки, но, к сожалению, недостаточно для закройте вопрос. Кто-нибудь еще?

(tl; dr дебаты в комментариях: whitequark до некоторой степени опровергает одну из моих гипотетических причин, почему ответ может быть «нет». Его аргументы заслуживают внимания, но, конечно, не являются доказательством того, что ответ - «да»).

8
задан Deduplicator 25 July 2015 в 19:52
поделиться