【问题标题】:Digit recurrence square root数字递归平方根
【发布时间】:2015-06-19 09:39:44
【问题描述】:

我需要为通用浮点格式实现数字递归平方根,例如 exp_size + mant_size + 1

我基本上遵循了这里建议的实现 handbook of floating point arithmetic在浮点运算符的软件实现中。

我试图测试我的实现(不是详尽的测试),基本上对于像 32 位这样的格式,它看起来工作正常,而对于像尾数 = 10、指数 = 5 的输入 x = 0.25 格式而不是给我 0.5 它显然给了我 0.707031。

所以我一直在徘徊,如果对于小格式,数字重复方法是否有一些限制,或者......只是我的实现很糟糕......

希望你能帮帮我……从 0 开始实现这些东西很痛苦……

【问题讨论】:

  • FPU 计算是在尾数和指数的较高位数上完成的(i8087+ FPU 的内部数字表示为 80 位),然后将结果截断到输出。如果你模仿这个,你就会得到正确的答案。如果你不想这样,你可以使用 bin 搜索方法(由于需要乘法,它有点慢,但结果应该更精确)
  • 我不确定你在说什么。但基本上“我的”方法是计算 mantissa_size 数字,mantissa_size 数字 + 1,这是因为平方根需要 1 位数字位才能正确舍入。但是对我来说这听起来有点奇怪,对于 10 位尾数精度(例如)和 5 的指数,我没有得到输入 0.25 的正确答案。

标签: algorithm floating-point numerical-methods


【解决方案1】:

查看您的代码非常困难,但您应该:

  1. 测试所有操作数组合

    • 如果它适用于单个示例并不意味着它适用于所有示例
  2. 检查位掩码

    • 你写的时候用 32bit 结果没问题
    • 当使用 10 时不使用
    • 暗示某处溢出
    • 您确定为 R 保留/屏蔽了正确的位数吗?
    • R 应该比 Q 多 2 位(精度 +1 位,符号 +1 位)
    • 您还应该将 R 作为二进制补码处理
    • Q 是 D 位的一半,无符号

找不到您的算法(您链接的那本书不允许我进一步了解 SQRT 开始的第 265 页可能是一些不兼容我使用好的旧 Opera)但这是我在 Google 中找到的最接近的算法(Non-Restoring-SQRT ) 在 FPGA 上的一些 PDF 研究和硬件实现中,在清除错误和测试后,这是我在 C++ 中编码和测试的内容:

DWORD u32_sqrt(DWORD D) // 32bit
    {
    const int   _bits  =32;
    const DWORD _R_mask=(4<<(_bits>>1))-1;
    const DWORD _R_sign= 2<<(_bits>>1);
    DWORD Q=0; // u(_bits/2    ) result (quotient)
    DWORD R=0; // i(_bits/2 + 2) 2os complement (remainder) R=D-Q*Q
    for (int i=_bits-2;i>=0;i-=2)
        {
        if (DWORD(R&_R_sign)){ R=(R<<2)|((D>>i)&3); R+=(Q<<2)|3; }  // R< 0
         else                { R=(R<<2)|((D>>i)&3); R-=(Q<<2)|1; }  // R>=0
        R&=_R_mask; Q<<=1; if (!DWORD(R&_R_sign)) Q|=1;             // R>=0
        }
    return Q;
    }

【讨论】:

  • 我没有做过详尽的测试是不是真的,但基本上对于__ms = 23,__es = 8的情况,它与书中的算法相同。我还检查了面具的东西,应该没问题。如果你愿意,我可以把对 pdf 感兴趣的书部分传给你,也许它更容易理解这个问题(我认为书的链接很好......)。
  • 但是无论如何......你对我的代码有什么建议呢?你认为是 Reminder R 的问题吗?你认为有更安全的方法来做同样的计算吗?实际上代码的核心是for循环。变量名取自那本书,解释也在那里报告。如果您认为我应该更好地解释一些事情,请告诉我...
  • 你可以在这里找到符号与我的相同的论文researchgate.net/publication/…
  • @Lukkio 那篇论文真的很模糊,目前没有明确的算法,它们只是被提及并比较了它们在特定平台上的性能而已。只需在您的问题中添加您如何计算这个(算法),在代码中添加更多注释,添加语言标签也是一个好主意(这样语法高亮就会起作用)
  • 你介意我们聊天,以便我更好地解释我的符号和算法吗?我试图自己推导出来,它看起来仍然是正确的......可能我错过了一些东西......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 2015-04-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多