4

我正在为我构建的一些实现仅定点算术的硬件编写软件驱动程序。我搜索了高低,但似乎找不到允许我将浮点数转换为固定(x:y)+1 符号位的通用算法。我还想将其表示为一个 int,以便我可以测试用 python 和 c++ 编写的一般模拟算法的准确性和速度比较。(我使用的是 64 位 Macbook Pro)

我在诺基亚网站http://developer.nokia.com/Community/Wiki/Fixed-point_math_for_Python上找到的最接近我需要的东西

但是他们只转换为 16:16 并且不太了解常量 65536.0 的来源,而我需要 x:y。

编辑---我仍然发现在转换回来时所有小数部分都丢失了,它转换的是fixed2int而不是fixed2float

def float2fixed(a,y):
    return int(round(a*pow(2,y))) #added round for better accuracy

def fix2float(a,y):
    return float(a/pow(2,y))

a = 2.3
b = float2fixed(a,32)
print(b)
print(fix2float(b,32))

输出

9878424780
2.0

编辑——当 x = y 固定(x:y)时的解决方案。稍后将在 x != y 时将方法发布到 fixed(x:y) 上。

def float2fixed(a,y):
    return int(round(a*pow(2,y)))  #added round for better accuracy

def fix2float(a,y):
    return float(a/pow(2,y))

编辑--这种新方法为任何 x(整数位 +1 符号) y(frac 位) 有符号而不是二进制补码提供了一个固定的二进制表示

def float2fixedBinary(a,x,y):
    #Set up fractional part in fixed point
    f = float2fixed(a,y)
    s = x+y
    binStr = '{0:0{width}b}'.format(f,width=s)
    #If -ve the - symbol is kept at the start of the string replace this
    return binStr.replace('-', '1')
4

2 回答 2

3

定点数学使用整数的顶部 X 位作为浮点数的整数部分,底部 Y 位作为小数部分。因此, 123.456 将类似于 00001234560000 (我在作弊,因为我们真的想要十六进制表示)。移动浮点 Y 位以使其适合整数的方式是乘以浮点(2* Y)。在 16 :16,2 *16 是 65536。如果你在做,比如说,32:32,你会移动 float(2**32) 或 4294967296。

于 2013-07-29T17:47:36.540 回答
0

您的计算机仅将数字理解为二进制数,因此当您进行“定点”数学运算时,该点被放置在整数中的二分之一处。更准确地说,float 只是计算固定点中可表示的最小值的所有数学运算。

在这个例子中,他们(相当随意,我可能会添加)将不动点放置在 32 位整数的第 16 位。这个数字表示的最小分数是 1/2^16 或 (1/65536)

于 2013-07-29T17:43:14.700 回答