【问题标题】:Handling Overflow in Fixed Point arithmetic处理定点算术中的溢出
【发布时间】:2017-06-11 17:39:57
【问题描述】:

我正在使用幻灯片 [1] 实现定点算法。一切正常,因为我的问题是链接的幻灯片,而且我读到的每个资源都说,当定点数相乘和相除时,它们会溢出一个很好的变化。所以他们建议将它们铸造成更大的尺寸以繁殖然后再铸造回去。喜欢,

(INT32)(((INT64)a *
        (INT64)b) >> N)

而不仅仅是,

 ((a * b) >> N)

这适用于 8,16,32 位整数,但如何处理 64 位整数的溢出?没有 128 位 int 类型(AFAIK gcc 有 128 位整数,但它们不可移植。)

我还想通过构造函数自动计算用户提供的 epsilon 所需的位数(所需的最小分数精度)像这样,

如果需要 0.01 精度,6 位对 N 来说就足够了。(因为 1/64 = 0.015)我无法弄清楚将精度转换为所需位的逻辑?

[1]http://jet.ro/files/The_neglected_art_of_Fixed_Point_arithmetic_20060913.pdf

【问题讨论】:

  • 要将精度转换为所需位,您可以使用简单的数学公式。 floor(log(1.0/required_accuracy)/log(2))
  • 实现long multiplication。回想一下,在小学时,您如何仅使用一位数乘法表来乘以两位十进制数。
  • 长乘法,正如 Igor 所说...但是 64 位定点不是很有用,所以你可能不需要费心。

标签: algorithm c++11 fixed-point


【解决方案1】:

您可以链接 64 位操作以产生 N*64 位操作。使用+,- 很简单O(n) 堆叠。对于*,^2,您可以使用 Karatsuba 了解更多信息,请参阅相关 QAs:

也可以使用这样的除法器(或任何其他近似值)进行除法:

有关更多信息,您可以查看任何 bigint/bigdecimal 库的源代码。

处理上溢/下溢的另一种方法是:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多