处理定点运算中的溢出

时间:2017-06-11 17:39:58

标签: algorithm c++11 fixed-point

我正在使用幻灯片[1]实现定点算术。一切都在工作,因为它应该是我的问题是链接的幻灯片,我读到的每一个资源说,当乘以和除去定点数时,它们溢出了一个很好的变化。因此他们建议将它们投射到更大的尺寸以便再增加然后再投回。像,

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

而不仅仅是,

 ((a * b) >> N)

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

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

如果需要0.01精度,则N位就足够了。(由于1/64 = 0.015),我无法找出将精度转换为所需位的逻辑?

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

1 个答案:

答案 0 :(得分:0)

你可以链接64位操作来产生N * 64位操作。 +,- O(n)堆叠很简单*,^2。对于Bool,您可以使用Karatsuba获取更多信息,请参阅相关的质量检查

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

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

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