我正在为我构建的一些硬件编写一个软件驱动程序,它实现了仅定点运算.我搜索了高低,但似乎找不到允许我将浮点数转换为固定(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))
编辑 – 这个新方法为任何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')
解决方法:
定点数学使用整数的前X位作为浮点数的整数部分,底部Y位作为小数部分.所以,123.456会像00001234560000(我作弊因为我们真的想要十六进制表示).移动浮点数Y位以使其适合整数的方式是乘以浮点数(2 * Y).在16:16,2 * 16是65536.如果你正在做,比方说,32:32,你将转移浮动(2 ** 32)或4294967296.