最近写数字运算的程序。 从FPGA获取的是固定点数、15位,最高位的bit14为符号位,bit13为整数位,低位的13位为小数。 另一方面,我的运算过程使用了浮点数。 经过一系列计算后,需要将计算结果作为常数点写入寄存器。 因此,首先需要编写常量点和浮点数相互转换的函数。
首先,明确固定点数和浮点数的概念。
决定积分数
定数点是小数点固定的数字。 计算机没有表示小数点的位数。 小数点的位置是默认的。 一般固定在机器数量的最低位之后,或者符号位之后。 前者称为定点纯整数,后者称为定点纯小数。
例题:用8位原代码表示定点整数(100 ) 10
(100 ) 10=(1100100 ) 2
定点整数是
例题:用8位原码表示定点纯小数(-0.6875 ) 10
(-0.6875 ) 10=(-0.1011 ) 2
定点纯小数表示如下
常数点表示法简单直观,但数值表示的范围太小,运算时容易发生溢出。
浮点数字
浮点数是小数点位置可以变动的数。 为了增大数值显示范围以防止溢出,采用了浮点表示法。 浮点表示类似于十进制的科学计数法。
在计算机中,浮点数通常分为阶码和尾数两部分来表示。 其中,阶码通常用补数定点整数表示,尾数通常用补数或原码定点小数表示。 为了不破坏有效数字,归一化尾数的处理(也就是所谓的科学记数法)确保尾数的最高位是1,而实际数值通过步进码被调整。
常用浮点数在机器上的格式为:
阶符号表示指数的已编码比特,阶符号表示幂,整数符号表示尾数的已编码比特,并且尾数表示标准化的小数值。
N=尾数基数阶码(指数) )
例题:二进制-110101101.01101可以写为- 0.1101011010121001
这几个机器上的格式是。 (步骤代码用8表示,尾数用24位表示) ) ) )。
c语言代码的实现如下:
/* * * * * * * * * * * * * * * * * *
*函数名称: BspFixToDou
*功能说明:将指定的点数转换为浮点数
*算法说明:无
*输入参数: ucType 0无符号1表示有符号
* ucInteger指示整数占多少位
* ucdecimal表示小数占多少位
* llfix是要转换的点数
*无输出参数:
*无返回值:
* * * * * * * * * * * * * * * * *
voidbspfixtodou(ucharUCtype、UCHAR ucInteger、UCHAR ucdecimal、UINT64 llfix、DOUBLE *pdbRet ) )。
{
uint64lltemp=llfix (() ) ) ) (uint64 ) )1) ) ) )。
if(0==llfix ) ) )。
{
*pdbRet=0.0;
}
(if(lltemp () (uint64 ) )1) ) ) ) ) ) )。
{
* pdb ret=-(双精度) ) ) ) ) (UINT64 ) )1) ) ) ) )。
}
else /*无符号数或有符号数的正数*/
{
* pdb ret=(双) (双) lltemp/(双) ) UINT64 ) 1
}
}
/* * * * * * * * * * * * * * * * * *
*函数名称: BspDouToFix
*功能说明:将指定的浮点数转换为固定点数
*算法说明:无
*输入参数: ucType 0无符号1表示有符号
* ucInteger指示整数占多少位
* ucdecimal指示小数占多少位
* dbDou是要转换的浮点数
*无输出参数:
*返回值:转换后的固定点数
* * * * * * * * * * * * * * * * *
voidbspdoutofix(ucharUCtype、UCHAR ucInteger、UCHAR ucdecimal、DOUBLE dbDou、UINT64 *pllfix ) )。
{
UINT64 lltemp=0;
双数据库模板=0;
dbtemp=dbDou;
if(dbtemp0)/*有符号正数或无符号数(/
{
lltemp=(uint64 ) (-dbDou*(1) 1
*
}
ELSEif(dbtemp0)/*带符号的负数) /
{
*PLLfix=(uint64 ) ) dbdou*(1
}
else
{
*pllfix=0;
}
}