Беззнаковые 32-битные целые числа в Javascript

Как я могу эмулировать 32-битные целые числа без знака без каких-либо внешних зависимостей в Javascript? Трюки с x >>> 0 или x | 0 не работают (для умножения они вроде работают для сложения/вычитания), а удвоения теряют точность при умножении.

Например, попробуйте умножить 2654435769 * 340573321 (по модулю 2^32). Результат должен быть 1.

Этот ответ имеет умножение. А сложение/вычитание/деление?

Вот ссылка на вольфрам альфа, представляющий приведенное выше уравнение.


person user1367401    schedule 28.07.2012    source источник
comment
Но результат 2654435769 * 340573321 не подходит для 32-бит...   -  person Šime Vidas    schedule 28.07.2012
comment
@Šime Vidas: Но мод 2 ^ 32 работает; это то, что он делает с вычислениями, если я правильно понимаю.   -  person pimvdb    schedule 28.07.2012
comment
@pimvdb: да, именно так работают 32-битные целые числа без знака - все операции выполняются по модулю 2 ^ 32.   -  person user1367401    schedule 28.07.2012
comment
Понимаю. Я удивлен, что двойники так теряют точность, я понятия не имел.   -  person Šime Vidas    schedule 28.07.2012
comment
это может быть полезно stackoverflow.com/questions/307179/   -  person lord.didger    schedule 28.07.2012


Ответы (1)


32-битное целое число без знака соответствует 64-битному формату с плавающей запятой. не допускать потери точности при выполнении сложения, вычитания или деления. Просто замаскируйте с помощью 0xffffffff, чтобы остаться в пределах 32-битного целого числа. Умножение выходит за рамки того, что подходит, но у вас уже есть решение для этого.

person ephemient    schedule 28.07.2012
comment
Однако после умножения точность может быть недостаточно высокой, потому что умножение 32-битных целых чисел может дать 64-битное целое число, в то время как 64-битное число с плавающей запятой может представлять только 53 значащих бита. Есть ли способ лучше? - person robbie fan; 07.11.2016