scanf可不可以输入浮点型_简析浮点数存储方式

b1a59d463578a0446dfb6cd9f44f7b50.png

一、IEEE754标准

IEEE二进制浮点数算术标准(IEEE 754)是20世纪80年代以来最广泛使用的浮点数运算标准,为许多CPU与浮点运算器所采用。这个标准定义了表示浮点数的格式(包括负零-0)与反常值(denormal number)),一些特殊数值(无穷(Inf)与非数值(NaN)),以及这些数值的“浮点数运算符”;它也指明了四种数值舍入规则和五种例外状况(包括例外发生的时机与处理方式)。

——以上来源于百度百科,介绍本文所采用的标准。

二、浮点数存储方式

d9fd2fd08e6e57c88045791f04345b16.png

1、符号位:‘+’存储为0,‘-’存储为1

2、将数字转化成二进制数

3、将二进制数规范化为 1.xxxxxxxx*2^n

4、 将n转化为指数(+127) 尾数xxxx后面补零

三、举例

1、5.75的二进制表示

符号位:0(代表为正数)

由5.75 = 1.0111 * 2^2

指数部分为2 尾数部分为0111

所以

指数位:2+127 = 129 = 1000 0001

尾数位:0111 0000 0000 0000 0000 000

完整二进制表示如下:

0 1000 0001 0111 0000 0000 0000 0000 000

2、-161.875的二进制表示

符号位:1(代表为负数)

由161.875 = 1.0100001111 * 2^7

指数部分为7 尾数部分为0100001111

所以

指数位:7+127 = 134 = 1000 0110

尾数位:0100 0011 1100 0000 0000 000

完整二进制表示如下:

1 1000 0110 0100 0011 1100 0000 0000 000

4、程序验证(以C程序为例)

/*输出浮点数的二进制形式*/
#include <stdio.h>

int main(void)
{
	float fnum = 1;
	int i;
	int * p = (int *)&fnum;//定义一个指向fnum的指针
        int x=0;//设置flag变量
	while (fnum != 0)//以0作为输入结束标志
	{
		printf("input a num: ");
		x=scanf("%f", &fnum);
                if(!x)//判断是否输入成功
                {
                       printf("wrongn");
                       fflush(stdin);//清空输入流,不然会死循环
                       continue;
                }
		for (i = 31; i >= 0; i--)
		{
                      /*将1左移i位,通过与运算判断第i位是否为1*/
                      printf("%d", (*p & (1 << i) ? 1: 0));
                      /*控制空格输入*/
                      if(i==31||i==23)
                           printf("  ");
                      if(i==27||i==19||i==15||i==11||i==7||i==3)
                           printf(" ");
		}
		printf("n");
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值