我正在使用幻灯片[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
答案 0 :(得分:0)
你可以链接64位操作来产生N * 64位操作。 +,-
O(n)
堆叠很简单*,^2
。对于Bool
,您可以使用Karatsuba获取更多信息,请参阅相关的质量检查:
也可以使用这样的分频器(或任何其他近似值)进行分割:
有关更多信息,您可以查看任何bigint / bigdecimal lib的源代码。
处理溢出/下溢的另一种方法是: