float型保留几位小数和有效数字 c语言float四舍五入

电子计算机只能存储0和1,人类世界所能认识的任何数据都需要通过转换为二进制再进行存储。整数(int)型转换为二进制存储很好理解,那么float型数据计算机又是怎么存储的呢?常说的浮点型数据精度丢失和数据溢出又是怎么回事呢?电子计算机只能存储0和1,任何人类世界能理解的...

电子计算机只能存储0和1,人类世界所能认识的任何数据都需要通过转换为二进制再进行存储。整数(int)型转换为二进制存储很好理解,那么float型数据计算机又是怎么存储的呢?常说的浮点型数据精度丢失和数据溢出又是怎么回事呢?

电子计算机只能存储0和1,任何人类世界能理解的数据都需要转换成二进制再存储。整数(int)转换成二进制存储很好理解,那么浮点数据计算机是怎么存储的呢?浮点数据的精度损失和数据溢出是怎么回事?

浮点图

位和字节

bit:来源于英文bit,音译为“bit”,意为二进制位。是计算机中数据存储的最小单位,11010100是一个8位二进制数。

Byte:来源于英文Byte,音译为“Baite”,传统上用大写的“B”表示。
字节是计算机处理数据的基本单位。计算机以字节为单位存储和解释信息,规定一个字节由八个二进制位组成,即一个字节等于八位(1字节= 8位)。八位二进制数最低为0000000,最高为1111111;通常一个字节可以存储一个ASCII码,两个字节可以存储一个中国国标码。

int数据存储

Type int数据根据不同的平台类型占用不同的字节。这里,使用正常的4字节。整数分为有符号和无符号,符号左边最高位是符号位。

Unsigned int和signed in按四个字节计算,即4*8=32位。默认情况下,Int是有符号的。所以无符号int的取值范围是:0~2的32次方-1。signint的范围是:-2的31次方~2的31次方-1。

例如+3,转为二进制是000 0011,但是计算机是按补码存储整型数据的,正数的补码就是其本身,但是负数的补码就不是了。这里不作细讲,有兴趣的朋友可以翻看我前面的文章,里面有详细介绍。

比如+3换算成二进制就是000 0011,但计算机是按补码存储整数数据的。正数的补数是本身,负数的补数不是。这里就不赘述了。有兴趣的朋友可以看看我之前的文章,里面有详细的介绍。

塑造数据存储模式

浮点数据存储

浮点数到二进制方法

Deci***l deci***l通过”转换为二进制deci***l;2乘圆,按顺序取出”法律。

整数部分用整数法转换,用短除法,小数部分用小数点按如下方式组合;

具体方法是:将小数部分乘以2得到乘积,取出乘积的整数部分,将剩余的小数部分乘以2得到另一个乘积,再取出乘积的整数部分。这样做,直到乘积的小数部分为零或达到要求的精度。
然后,提取的整数按顺序排列,第一个整数为二进制十进制的高有效位,最后一个整数为低有效位。

例:0.734375到二进制,结果是0.101111。

0.734375 x 2 = 1.46875

0.46875 x 2 = 0.9375

0.9375 x 2 = 1.875

0.875 x 2 = 1.75

0.75 x 2 = 1.5

0.5 x 2 = 1.0

IEEE二进制浮点算术标准

浮点数的存储方式不同于整数数据。浮点运算有自己的标准,也称为IEEE二进制浮点运算标准(IEEE 754),是20世纪80年代以来使用最广泛的浮点运算标准,被许多CPU和浮点运算单元采用。

根据国际标准IEEE(电气与电子工程协会),任意浮点数NUM的二进制数可以写成:
NUM =(-1)S * M * 2 E;//(S代表符号,e代表阶乘,m代表有效数字)

这个标准是什么意思?其实说白了就是二进制科学计数法:

小数:12345678 = 1.2345678 * 10 ^ 7;

二进制:比如十进制11.0,写成二进制就是1011.0,用IEEE标准表示就是(-1)0×1.011×2 ^ 3,s=0,M=1.011,e = 3;

浮点数存储

浮点数存储在内存中,如下图所示:

1.对于S,用来表示符号,0为正,1为负。

2.对于M:规定存储M时要去掉前1,只存储小数点后的位数。这样可以节省空之间的时间。以float类型为例,可以保存23个十进制信息,丢弃1时可以用23位表示24个有效信息。

3.对于E(指数),E是一个字节(8位)整数,所以E的取值范围是(0~ 255),但指数在计数时可以是负数。所以规定中间数(127)在存储时要加到原值上,使用时要减去中间数(127),这样E的真值范围就变成(-127)

因此,32是一个单精度浮点数:在IEEE-754标准中,32位浮点数X的真值可以表示为:

X = (-1)^S×(1.m)×2 ^(e-127);

准确性丧失

了解浮点数据的存储原理,进而了解浮点精度损失的原因,以浮点数2.7为例:

首先,十进制转换成二进制。因为2.7不能准确的用二进制表示,这里就有了精度的损失。

2.7 = >10.10110011001…

然后用IEEE标准表示二进制浮点数,得到s=0,M=1.010110011001…,E=1。

10.1011001… = >(-1)^0 × 1.01011001… × 2^1

最后,按照IEEE标准保存数据。此时是单精度浮点数,M只能保存小数点后23位,多余的部分被丢弃了,因此此处又一次精度丢失。

最后,按照IEEE标准保存数据。此时是单精度浮点数,M只能保留小数点后23位。多余的部分被丢弃了,所以这里的精度又损失了。

准确度损失指示

溢出

由于存储是有位限制的,所以溢出很好理解。超过最大值的数可以表示为上溢,超过最小值的数可以表示为下溢。只要能计算出最大值和最小值的分数,就能得到溢出的上限和下限:

上溢极限:

溢出限制:

溢出极限

下溢极限:

下溢限制:

下溢极限

本文来自玩味不尽投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/496561.html

打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
() 0
上一篇 04-09
下一篇 04-09

相关推荐

  • float型保留几位小数和有效数字 c语言float四舍五入

    电子计算机只能存储0和1,人类世界所能认识的任何数据都需要通过转换为二进制再进行存储。整数(int)型转换为二进制存储很好理解,那么float型数据计算机又是怎么存储的呢?常说的浮点型数据精度丢失和数据溢出又是怎么回事呢?电子计算机只能存储0和1,任何人类世界能理解的

    2023-04-09 10:51:01
    986 0

评论列表

联系我们

在线咨询: QQ交谈

邮件:admin@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信