IEEE754制-32位浮点数据转换为10进制

/* 功    能:	将32位浮点数据转换为10进制
 * 输    入:	
 * 输    出:	
 * 返    回:	
 * 修改日期:	
 * 作    者:	
 * 备    注:	
 */
 
float ConvertFloatToDecimal(uint32_t data)
{
	uint32_t temp = data;
	float result = 0.0;

	uint8_t part1 = data >> 31;						//符号部分
	int16_t part2 = ((data>>23) & 0xFF)-127;		//指数部分  0-255间的数据
	uint32_t part3 = (data & 0x7FFFFF);				//尾数部分
	uint32_t part4 = (data & 0x7FFFFF) | 0x800000;	//尾数部分 - 组合 1.尾数部分
	
	//从低位开始确定0位置,减少幂计算次数
	int positon = 0;	//从此位开始,字位不为0
	for(int i = 0;i < 23;i++)
	{
		positon = i;
		if(((part4 >> i) & 0x1) == 0x1)
		{
			break;
		}		
	}
	
	for(int i = 23;i >= positon;i--)
	{
		int p1 = (part4>>i) & 0x1;
		double p2 = pow(2,part2 + i - 23);
		result += p1 * p2;
	}	
	return part1==0 ? result : -result;	
}
//

 上面转换实际计算需要1.3ms(取决于芯片频率,以及传参)

下面取代pow计算,单次计算在0.1ms内。

const double PowerPositiveValue[25] = 
{
	1,			2,			4,			8,			16,				// 0  1  2  3  4
	32,			64,			128,		256,		512,			// 5  6  7  8  9
	1024,		2048,		4096,		8192,		16384,			// 10 11 12 13 14
	32768,		65536,		131072,		262144,		524288,			// 15 16 17 18 19
	1048576,	2097152,	4194304,	8388608,	16777216		// 20 21 22 23 24
};

const double PowerNegativeValue[26] = 
{
	1,						0.5,				0.25,					0.125,					0.0625,					//  0  -1  -2  -3  -4
	0.03125,				0.015625,			0.0078125,				0.00390625,				0.001953125,			// -5  -6  -7  -8  -9
	0.0009765625,			0.00048828125,		0.000244140625,			0.0001220703125,		0.00006103515625,		// -10 -11 -12 -13 -14
	0.000030517578125,		0.0000152587890625,	0.00000762939453125,	0.000003814697265625,	0.0000019073486328125,	// -15 -16 -17 -18 -19
	0.00000095367431640625,										// -20
	0.000000476837158203125,									// -21
	0.0000002384185791015625,									// -22
	0.00000011920928955078125,									// -23
	0.000000059604644775390625,									// -24
	0.0000000298023223876953125									// -25
};

/* 功    能:	IEEE754 将32位浮点数据转换为10进制
 * 输    入:	
 * 输    出:	
 * 返    回:	
 * 修改日期:	2024-4-13
 * 作    者:	
 * 备    注:	避免使用pow,加快计算速度
 */
float ConvertFloatToDecimal(const uint32_t data)
{
	float result = 0.0;

	uint8_t part1 = data >> 31;						//符号部分
	int16_t part2 = ((data>>23) & 0xFF)-127;		//指数部分  0-255间的数据
	uint32_t part3 = (data & 0x7FFFFF);				//尾数部分
	uint32_t part4 = (data & 0x7FFFFF) | 0x800000;	//尾数部分 - 组合 1.尾数部分
	
	for(int i = 0;i < 24;i++)
	{
		int p1 = (part4>>(23-i)) & 0x1;
		if(p1 == 0)									//因数为0,乘积为0,不参与本次计算
			continue;
		
		int power = part2 - i;						//计算幂指数
		
		double p2 = 0.0;					
		if(power >=0 && power < 25)					//查正值表
			p2 = PowerPositiveValue[power];
		else if(power <=0 && power > -26)			//查负值表
			p2 = PowerNegativeValue[-power];
		else										//表外数据,计算,不影响结果的,可以直接取零
			p2 = 0;//pow(2,part2 - i);
				
		result += p1 * p2;
	}	
	return part1==0 ? result : -result;	
}
//

貌似最简单的方法就是利用C语言的联合union来处理,利用底层存储机制读写,速度更快。

typedef union DBType32
{
    uint32_t Uword;
    int32_t Sword;
    float Fword;
};

### 回答1: 很抱歉,作为AI语言模型,我无法直接进行计算和转换。但是,我可以告诉你如何将一个十进制数表示成IEEE754标准的32位浮点规格化数。 IEEE754标准的32位浮点数由三个部分组成:符号位、指数位和尾数位。其中,符号位用来表示数的正负性,指数位用来表示数的大小,尾数位用来表示数的精度。 具体地,将一个十进制数表示成IEEE754标准的32位浮点规格化数的步骤如下: 1. 确定符号位:如果数为正,则符号位为;如果数为负,则符号位为1。 2. 将数的绝对值转换成二进数。 3. 将二进数规格化,即将小数点移动到第一个非零位前面,并记录移动的位数。 4. 计算指数位:指数位等于移动的位数加上一个固定的偏移量(127)的二进表示。 5. 计算尾数位:将规格化后的二进数的小数部分乘以2的23次方,并将结果转换成二进数。 6. 将符号位、指数位和尾数位拼接起来,得到IEEE754标准的32位浮点数。 希望这些信息能对你有所帮助。 ### 回答2: IEEE 754标准是一个指定了浮点数在计算机中的表示方法的标准。在IEEE 754标准中,浮点数32位二进数来表示,其中第一位是符号位,接下来8位是指数,剩下的23位是尾数。以下是将十进制数表示成IEEE 754标准的32位浮点规格化数的方法: 1.将十进制数转化为二进数。例如,如果要将3.14表示为32位二进数,则需要将3和0.14分别转化为二进数。 3的二进数为11,0.14的二进数可以用乘2取整法来求得:0.14*2=0.28,取整得0,再将0.28乘2,得到0.56,取整得1,继续将0.56乘2,得到1.12,取整得1,以此类推。最终得到3.14的二进表示为11.00100011110101110000101。 2.将二进数规范化。将小数点左移或右移,使得二进数的第一位是1,是为规范化。例如,将上面的二进数规范化为1.100100011110101110000101。 3.确定符号位。如果十进制数是正数,则符号位为0;如果是负数,则符号位为1。 4.将规范化后的尾数和指数转化为二进数。指数的表示方法是将十进制指数加上一个偏置值,偏置值是2^(8-1)-1=127。例如,指数为3时,其二进表示为127+3=130,即10000010。 5.将符号位、指数和尾数合并,得到32位的二进数,即为3.14的IEEE 754标准的32位浮点规格化数。 3.14的二进表示为11.00100011110101110000101,符号位为0,指数为130的二进表示为10000010,尾数为10010001111010111000010。将符号位、指数和尾数合并,得到32位的二进数为01000001010010001111010111000010,即3.14的IEEE 754标准的32位浮点规格化数为0x4048F5C3。其中,0x表示十六进,4048F5C3是其十六进表示。 ### 回答3: IEEE 754标准是一种二进数表示方法,其中32位二进数按照规定格式表示浮点数。给定一个十进制数,需要将其转换32位IEEE 754规范化浮点数。 步骤如下: 1.将给定的十进制转换成二进数。 比如,对于十进制数0.15625,可以使用乘2取整法转换为二进数0.00101。 2.将二进数标准化。 标准化的二进数即将小数点移到最左边,此时需要记录移动的位数。 对于0.00101,需要将小数点左移3位,得到规范化后的二进数1.01。 同时,需要记录移动的位数,即-3,将其转换成二进数0011。 3.确定符号位、阶码和尾数。 符号位为0,表示正数。 阶码为指数部分加上一个偏移值(127),即2的7次方。 对于0.00101,阶码为-3+127=124,转换成二进数为01111100。 尾数即去掉整数部分的1之后剩余的位数,此处为01。 4.将符号位、阶码和尾数拼成32位二进数。 符号位为0,占用1位。 阶码占用8位,转化为二进数为01111100。 尾数占用23位,为01000000000000000000000。 最终的32位二进数为0 01111100 01000000000000000000000。 这就是十进制数0.15625的IEEE 754规范化浮点数表示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枫中眸zc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值