C语言:IEEE754十进制数转二进制单精度浮点数

C语言:IEEE754十进制数转二进制单精度浮点数


1. 背景知识

  1. IEEE754是由IEEE制定的有关浮点数的工业标准。针对于单精度浮点数,其公式如下,S为符号位,只占1位,为0表示正数,为1表示负数。P为指数(阶码),用移码表示,占8位。M为尾数,用原码表示,占23位。

X = (-1)S * 1.M * 2P-127

  1. 浮点数规格化表示:当尾数的值不为0时,规定尾数域的最高有效位为1,不符合规定的则将阶码左移或右移小数点位置。

2. 程序代码

//编程环境:
//    操作系统:windows 7
//    编程工具:VS2017
//    编程语言:c/c++语言

#include "pch.h"
#include <iostream>
#include <stdio.h>

//整数转r进制
//integer:整数 radix:进制 result:结果数组 num:生成r进制所占位数
void D1toB(int integer, int radix, int result[], int &num)
{
	int i, j, n;
	for (i = 0; integer > 0; i++)//除r取余
	{
		result[i] = integer % radix;
		integer = integer / radix;
	}
	num = i;//r进制位数
	for (j = 0; j < i / 2; j++)//颠倒顺序 
	{
		n = result[j];
		result[j] = result[i - 1 - j];
		result[i - 1 - j] = n;
	}
}

//小数转r进制
//decimal:小数 radix:进制 result:结果数组 num:生成r进制所占位数
void D2toB(double decimal, int radix, int result[], int &num)
{
	int i;
	for (i = 0; decimal > 0 && i < 50; i++)//乘r取整
	{
		result[i] = decimal * radix;
		decimal = decimal * radix;
		decimal = decimal - int(decimal);
	}
	num = i;
}

int main()
{
	int integer;//整数部分 
	double decimal;//小数部分 
	int s, p[8], m[50];//浮点数符号位,阶码数,尾数 

	while (true)
	{
		double number;//输入的浮点数 
		printf("请输入一个浮点数:");
		scanf_s("%lf", &number);
		getchar();

		int i, j;
		for (i = 0; i < 8; i++)//清零
		{
			p[i] = 0;
		}
		for (i = 0; i < 50; i++)
		{
			m[i] = 0;
		}

		//确定符号位 
		if (number > 0)
		{
			s = 0;
		}
		else
		{
			s = 1;
			number = -number;
		}
		//将浮点数分成整数和小数 
		integer = (int)number;
		decimal = number - integer;
		//分别将整数和小数转化成二进制 
		int m_n1, m_n2;
		D1toB(integer, 2, m, m_n1);
		D2toB(decimal, 2, m + m_n1, m_n2);
		//规格化,计算阶数, 尾数
		int pn = 0;//阶数 
		
		if (integer > 0)//小数点左移
		{
			pn = m_n1 - 1;//阶数 
			for (i = 0; i < 23; i++)//去掉首位默认的1
			{
				m[i] = m[i + 1];
			}
		}
		else//小数点右移
		{
			for (i = 0; m[i] == 0; i++)
			{
			}
			pn = -i -1;
			for (j = 0; j < 23; j++)//去掉左边无效的0和第一个的1
			{
				m[j] = m[j + 1 + i];
			}
		}
		//计算阶码
		int p1[8], pn1;
		D1toB(pn + 127, 2, p1, pn1);//阶数转二进制 
		if (pn1 < 8)//不足8位左边补0 
		{
			for (j = 0; j < 8 - pn1; j++)
			{
				p[j] = 0;
			}
			for (int k = 0; k < pn1; k++)//得出完整p 
			{
				p[j + k] = p1[k];
			}
		}
		else
		{
			for (i= 0; i < 8; i++)//得出完整p 
			{
				p[i] = p1[i];
			}
		}

		//输出s
		printf("%d ", s); 
		//输出p
		for (i = 0; i < 8; i++)
		{
			printf("%d", p[i]);
		}
		printf(" "); //输出s
		//输出m
		for (i = 0; i < 23; i++)
		{
			printf("%d", m[i]);
		}
		printf("\n\n");
	}
	return 0;

}

运行结果

提示:此程序为个人编写,结果仅作参考,若有不对之处,请指正。

  • 11
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值