【发布时间】: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