【发布时间】:2021-04-15 16:52:25
【问题描述】:
Webassembly 仅提供一种更高级的浮点运算:平方根。
它没有任何其他通常在 CPU 中实现的功能,例如幂函数和三角函数,官方常见问题解答中解释了这个基本原理:
WebAssembly 不包含自己的数学函数,如 sin、cos、exp、 战俘,等等。 WebAssembly 对此类功能的策略是允许 它们将在 WebAssembly 本身中作为库例程实现(注意 x86 的 sin 和 cos 指令缓慢且不精确, 无论如何,这些天通常都避免了)。希望更快使用的用户 WebAssembly 上不太精确的数学函数可以简单地选择一个数学 这样做的库实现。
这引出了一个问题,如果平方根有什么特别之处可以证明有理由对其进行例外处理。它对距离计算很有用,但它是否比其他类型的幂或指数更频繁地出现?它在 CPU 上是否特别快并且他们想利用它?
如果我们制作两个函数桶,
- 首先是加法、乘法、除法和余数和
- 第二个是幂、三角函数及其反演
那他们为什么要把平方根放在第一位呢?
编辑:我刚刚意识到 sqrt 的特殊之处在于可以通过将指数向右移动来找到近似值。确切的结果仍然需要找到尾数的平方根,这仍然是一个交互过程。但是,正如 Olsonist 所指出的那样,也许这一领先优势使 sqrt 足以保证将其纳入 IEEE 所需的操作中。
还有一个属性是 sqrt(x*x)=x 对所有 x 而言,x*x 没有上溢或下溢,这对于可能涉及舍入 (see this SO answer) 的操作是不常见的。
【问题讨论】:
-
平方根是比正弦、余弦、e^x 等更简单的函数。它很容易计算,我们有完整的证据来说明如何准确计算它。其他的更难,我们没有完整的证明(关于各个方面;很复杂)。
-
@EricPostpischil 好吧,因为 (x + x/2)^2 = 9/4*x^2 您可以进行二进制搜索以获得一个整数平方根,该整数平方根取尾数的对数位循环并仅使用移位和求和(无乘法)。正如我在编辑中已经指出的那样,指数部分更容易。也许我错过了一些东西,但这似乎更容易。我怀疑仅通过移位和相加就能如此快速地计算正弦。
标签: webassembly ieee-754