有关浮点数的存储

在这里插入图片描述


前言

我们知道浮点数在存储是会发生精度丢失的情况,致使数据无法精确存储,这里我将讲解有关浮点数存储是长度与精度的问题。以下我将以float为例。


一、浮点数如何存储

根据标准规定任意一个浮点数都必须表示为(-1)SxMx2^E
其中S为符号位:S为0表示正数,S为1表示负数。
其中M为有效数字。M属于[12)。
其中E为指数。
图如下:
在这里插入图片描述

那么6.5是如何存储的?
如下:(对于浮点数而言6.5可以精确存储)
在这里插入图片描述

在这里插入图片描述

至此我们对浮点数的存储有了基本的了解,下面就要讲解浮点数为什么会有精度丢失的问题。

二、长度(有效位数)与精度

1.对于整数

影响整数用浮点数方式存储导致精度丢失的原因在长度(有效数位)

对于float型
若在不考虑指数的情况下,
其23位有效数位其可以表示的最大数是:1111 1111 1111 1111 1111 111
再加上默认的1,其数列为1111 1111 1111 1111 1111 1111
用浮点数的形式来表示就是 (-1)*0 1111 1111 1111 1111 1111 111 2^23
其转化为十进制就是16 777 215
所以对于整数而言浮点数(float)可连续的表示0~16 777 215 的数,超出这个范围就会发生精度丢失的情况。
而对于16 777 215的科学计数法的表现形式为1.6 777 215 x 10 ^7。所以其长度为8,即float最少保存8位有效数字不会发生精度丢失。
如下:

int main()
{
	float i = 1234567;
	float j = 12345678;
	float k = 1234567891;
	printf("%f\n", i);
	printf("%f\n", j);
	printf("%f\n", k);

	return 0;
}

其结果如下:
在这里插入图片描述

2.对于小数

影响小数存储于浮点数导致精度丢失的原因是二进制下的小数部分是跳跃的
如下:
在这里插入图片描述
所以对于小数部分不能表示成以上二进制相加的形式,就会发生精度丢失。
对于2.5(十进制)
其小数部分可以用二进制表示,则2.2就不会发生精度丢失。

int main()
{
	float n = 2.5;
	printf("%f\n", n);
	return 0;
}

结果是:
在这里插入图片描述

对于5.2(十进制)
其小数部分不能用二进制表示,所以其会发生精度丢失。
其二进制数列为0100 0000 1010 0110 0110 0110 0110 0110。

int main()
{
	float n = 5.2;
	printf("%f\n", n);
	return 0;
}

结果如下:
在这里插入图片描述

总结

以上就是我对于浮点数的了解。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

水月梦镜花

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

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

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

打赏作者

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

抵扣说明:

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

余额充值