我们用数学表达式做一下总结:
x表示实际的数(*一个浮点数),q表示它的Qn型定点小数(一个整数)。
q=(int)(x*2^n)
x=(float)q/2^n
由以上公式我们可以很快得出定点小数的+-*/算法:
假设q1,q2,q3表达的值分别为x1,x2,x3
q3=q1+q2若x3=x1+x2
q3=q1-q2若x3=x1-x2
q3=q1*q2/2^n若x3=x1*x2
q3=q1*2^n/q2若x3=x1/x2
我们看到加减法和一般的整数运算相同,而乘除法的时候,为了使得结果的小数点位不移动,对数值进行了移动。
用c语言来写定点小数的乘法就是:
shortq1,q2,q3;
....
q3=((longq1)*(longq2))>>n;
由于/2^n和*2^n可以简单的用移位来计算,所以定点小数的运算比浮点小数要快得多。下面我们用一个例子来验证一下上面的公式:
用Q12来计算2.1*2.2,先把2.12.2转换为Q12定点小数:
2.1*2^12=8601.6=8602
2.2*2^12=9011.2=9011
(8602*9011)>>12=18923
18923的实际值是18923/2^12=4.619873046875和实际的结果4.62相差0.000126953125,对于一般的计算已经足够精确了。
来源: