为什么webassembly有平方根操作码?
Webassembly 仅提供一种更高级的浮点运算:平方根。
它没有任何其他通常在 CPU 中实现的功能,例如幂和三角函数,官方常见问题解答中解释了这一基本原理:
WebAssembly 不包含自己的数学函数,如 sin、cos、exp、pow 等。WebAssembly 对此类函数的策略是允许它们在 WebAssembly 本身中作为库例程来实现(请注意,x86 的 sin 和 cos 指令缓慢且不精确,并且现在通常会避免使用)。希望在 WebAssembly 上使用更快、更不精确的数学函数的用户可以简单地选择一个数学库实现。
这就引出了一个问题,如果平方根有什么特别之处可以证明它有例外。它对距离计算很有用,但是它是否比其他类型的幂或指数出现得更频繁?它在 CPU 上是否特别快并且他们想利用它?
如果我们做两桶函数,
- 第一个是加法、乘法、除法和余数
- 第二个是幂、三角函数和它们的求逆
那他们为什么把平方根放在第一位呢?
编辑:我刚刚意识到 sqrt 的特殊之处在于可以通过将指数向右移动 1 来找到近似值。确切的结果仍然需要找到尾数的平方根,这仍然是一个交互过程。但是,正如 Olsonist 指出的那样,这种领先优势可能使 sqrt 足够好,可以保证包含在 IEEE 所需的操作中。
还有一个属性,sqrt(x*x)=x对于所有x这些x*x都不会溢出或下溢,这对于可能涉及舍入的操作来说是不寻常的(请参阅此 SO 答案)。
回答
IEEE 754-2008是 WebAssembly 的要求,sqrt是IEEE 754-2008的要求,而sin , cos , ... 不是IEEE 754-2008 的要求。它们是推荐的,但不是必需的。