![]() |
1
11
我忍不住花了一个小时来解决你的问题… Jean-Michel Muller(法语)在“坐标算术”第5.5.2节中描述了该算法。它实际上是以1为起点的牛顿迭代的一个特例。这本书给出了计算n/d的算法的一个简单公式,其中d在[1/2,1[:
每次迭代的正确位数加倍。在32位的情况下,4次迭代就足够了。您还可以迭代到
使用规范化是因为它提供了结果中的最大有效位数。当输入在已知范围内时,计算所需的误差和迭代次数也更容易。 一旦你的输入值被规范化了,你就不需要为base的值操心了,除非你有相反的值。你只需要在0x8000000到0xffffffff的范围内规范化一个32位数字x,然后计算一个近似值y=2^64/x(y最多为2^33)。 此简化算法可用于您的q22.10表示,如下所示:
如代码中所述,乘法不是完全的32x32->64位。E将变得越来越小,最初适合32位。Q将始终为34位。我们只接受高32位的产品。
推导
编辑。作为我评论的后续,这里是第二个版本,在q上有一个隐式的32位。现在e和q都存储在32位上:
|
![]() |
2
1
给你几个主意,尽管没有一个能直接解决你的问题。
重复n位次,从clz开始进行二进制搜索,以确定从何处开始。太快了。
再说一次,不是直接给你答案,但可能有一些想法来推进这个。看到实际的arm代码可能对我也有帮助。 |
![]() |
3
0
玛兹,你一点也不失精准。当你用512.00002F除以2^10时,你只需将浮点数的指数减少10。尾数不变。当然,除非指数达到其最小值,但这不应该发生,因为你正在缩放到(0.5,1)。 编辑:好的,所以你用的是固定的小数点。在这种情况下,应该允许算法中分母的不同表示。d的值不仅从(0.5,1]开始,而且在整个计算过程中(很容易证明x*(2-x)<1代表x<1)。所以你应该用小数点表示分母,基数是32。这样你就可以一直保持32位的精度。 编辑:要实现此功能,您必须更改以下代码行:
最后,你将不得不移动n,而不是按位,而是一些不同的值,我现在懒得弄明白:)。 |
![]() |
Muhammad Umer · 为什么这个随机数猜谜游戏模拟产生5.8 5 月前 |
![]() |
Alisa Petrova · 在有向图中更改一对顶点以创建循环 6 月前 |
|
D W · Python-将浮点数从2转换为10到100位小数 7 月前 |
![]() |
Bartol · 确定python龟图形中的角度 11 月前 |
|
randomAlgo · 将弹簧设置为相同长度的成本最低 11 月前 |
![]() |
Fyodor · 在C中使用sin和cos计算数学表达式不正确? 12 月前 |
![]() |
Sergio · python中大量数字的乘法 12 月前 |