将float转换为表示为int的泛型固定点

时间:2013-07-29 17:37:02

标签: c++ python math hardware

我正在为我构建的一些硬件编写一个软件驱动程序,它实现了仅定点运算。我搜索了高低,但似乎找不到允许我将浮点数转换为固定(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)时的解。稍后将post方法用于在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))

EDIT--这个新方法为任何x(整数位+1符号)y(压缩位)提供固定的二进制表示,而不是二进制补码

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')

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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

在这个例子中,它们(相当于任意,我可能会添加)将固定点放在32位整数的第16位。由该数字表示的最小部分是1/2 ^ 16或(1/65536)