我为什么要使用Math.imul()?

Mat*_*hew 9 javascript math

它的表现比*表达式好吗?为什么?

本文将其描述为对Emscripten等项目有用.这是为什么?

谢谢

val*_*man 18

精简版

Math.imul(a,b)将a和b相乘,就好像它们是32位有符号整数一样.(a*b)|0做同样的事情,但可能会给大数字提供不正确的结果.

长版

您可以Math.imul在需要乘以两个数字时使用,并且希望乘法操作就像两个数字是32位有符号整数一样.也就是说,你想要整数乘法模2 ^ 32.

通常,您可以通过对结果使用按位运算符来获得此效果.例如,(0xffffffff + 1)|0非常正确地给你0.但是,这不适用于乘法.(0x7fffffff * 0x7fffffff)|0给我们0,当两个数字的32位乘法给我们1.这种失败的原因是精确性.该Number类型是IEEE754双精度浮点数,具有53位尾数.当您尝试使用大于2 ^ 53的数字时,您开始失去精度.您可以Math.pow(2,53) == Math.pow(2,53)+1在浏览器中运行来测试它.

当您在Javascript中将两个32位数相乘并使用按位运算符截断结果时,中间结果可能大于2 ^ 53,因此可能不正确,这意味着最终结果当然也将是不正确的.

  • 应该注意的是,0xffffffff 不是一个大的 32 位有符号整数,因为 0xffffffff 是 -1。最大有符号值为 0x7fffffff。答案的其余部分是正确的,因为 (0x7fffffff * 0x7fffffff)|0 给你 0,而它应该是 1(这就是你应该使用 Math.imul 的原因)。(0xffffffff|0)*(0xffffffff|0)|0 正确计算为 1。 (3认同)
  • 糟糕,固定.很奇怪,任何人都需要一整年的时间才能注意到. (3认同)