二进制float与int之间的转化关系

废话不多说,先上代码:

#include<iostream>
using namespace std;

//二进制数不变(即01序列不变),从32位float型数据转成32位int型数据
int float2BitInt(float a)
{
	int bits[32] = { 0 };
	int sign = 0;
	float num = a;
	if (num < 0.0f)//取float数据的绝对值
	{
		num = -a;
		sign = 1;//符号位,1表示负数,0表示正数
	}
	bits[0] = sign;
	if (num < 1.0f)//小于1
	{
		float num1 = num;
		int bitRight = 0;
		while (num1 < 1.0f)
		{
			num1 *= 2;
			bitRight--;
			if (bitRight < -126)//若是小于2^-126太小无法精确
				break;
		}
		if (num1 < 1.0f)//小于2^-126
		{
			//for (int i = 1; i < 32; ++i)
			//	bits[i] = 0;
			int result = 0;
			return result;
		}
		int ex = bitRight + 127;
		for (int i = 8; i >= 1; --i)//指数部分的二进制
		{
			int curr = ex % 2;
			ex /= 2;
			bits[i] = curr;
		}
		num1 -= 1.0f;
		int iter = 23;
		int ii = 0;
		while (iter > 0)//尾数部分的二进制数
		{
			num1 *= 2;
			int tmp = int(num1);
			num1 -= tmp;
			bits[9 + ii] = tmp;
			++ii;
			--iter;
		}

	}
	else//大于1
	{
		int numBit = 0;
		float currNum = num;
		while (currNum > 1.0f)
		{
			currNum /= 2;
			numBit++;
		}
		int leftShift = std::max(0, numBit - 24);// num / pow(2.0f, );
		float smallNum = num / pow(2.0f, leftShift);
		int zhenshu = int(smallNum);
		float xiaoshu = smallNum - zhenshu;
		int em[24];
		int numBitOfZhenshu = 0;
		while (zhenshu > 0&& numBitOfZhenshu < 24)//得到整数部分的二进制数
		{
			int curr = zhenshu % 2;
			em[numBitOfZhenshu] = curr;
			numBitOfZhenshu++;
			zhenshu /= 2;
		}
		int ex = numBitOfZhenshu -1;
		int cr = std::min(ex, 23);
		for (int i = 0; i < cr; ++i)//得到尾数部分中整数的二进制数
		{
			bits[i + 9] = em[numBitOfZhenshu-2 - i];
		}
		int numBitOfXiaoshu = 23 - cr;
		int ii = 0;
		while (numBitOfXiaoshu > 0)//得到尾数部分中小数的二进制数
		{
			xiaoshu *= 2;
			int curr = int(xiaoshu);
			xiaoshu -= curr;
			bits[9+cr+ii] = curr;
			numBitOfXiaoshu--;
			ii++;
		}
		ex += leftShift;
		ex += 127;
		for (int i = 8; i >= 1; --i)//得到指数部分的二进制数
		{
			int curr = ex % 2;
			ex /= 2;
			bits[i] = curr;
		}
		
	}

	int result = 0;
	for (int i = 1; i < 32; ++i)
	{
		result += pow(2, 31 - i)*bits[i];
	}
	result *= (bits[0] == 0 ? 1 : -1);
	return result;
}

//二进制数不变(即01序列不变),从32位int型数据转成32位float型数据
float Int2BitsFloat(int num)
{
	int bits[30] = { 0 };
	int n = num;
	bits[0] = 0;
	if (n < 0)
	{
		n = -num;
		bits[0] = 1;
	}
	int iter = 31;
	while (iter > 0)
	{
		int curr = n % 2;
		bits[iter] = curr;
		n /= 2;
		--iter;
	}
	int sgn = bits[0];
	int ex = 0;
	for (int i = 1; i <= 8; ++i)
	{
		ex += pow(2, 8 - i)*bits[i];
	}
	ex -= 127;
	float result = pow(2.0f, ex);
	for (int i = 9; i < 32; ++i)
	{
		result += pow(2.0f, ex - i + 8)*bits[i];
	}
	result *= pow(-1.0f, sgn);
	return result;
}

//打印float型数的二进制数(32位01序列)
void FloatToString(float fNum)
{
	unsigned int nData = ((unsigned int *)&fNum)[0];
	char* pStr = new char[32];
	for (int i = 0; i < 32; i++)
	{
		pStr[31 - i] = (char)(nData & 1) + '0';
		nData >>= 1;
	}
	pStr[32] = '\0';
	for (int i = 0; i < 32; ++i)
		std::cout << pStr[i];
	std::cout << std::endl;
	delete[] pStr;
	pStr = NULL;
}
int main()
{
	float a;
	std::cout << "please input float number:" << std::endl;
	while (cin >> a)
	{
		std::printf("float number:%.10f\n",a);                //打印输入浮点数
		int result=float2BitInt(a);                           //将浮点数转成32位整数
		std::cout << "int bit number:" << result << std::endl;//打印32位整数
		float result1=Int2BitsFloat(result);                  //整数转成浮点数
		std::printf("float number:%.10f\n", result1);         //打印转换后的浮点数
		std::printf("result - a = %.10f\n", result1-a);       //打印转换前后浮点数之差,验证结果是否正确
	}
	return 0;
}

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值