浮点数在内存中的存储

简介: 浮点数在内存中的存储

一、用科学计数法存储小数

一个小数,如5.5,它在存储进入计算机之前会先转化成科学计数法的形式,先将5.5转化为二进制形式,即101.1,接着转化成科学计数法的形式便是1.011*2²,再进一步转化为国际标准IEEE(电气和电子工程协会)的形式,那么什么是国际标准IEEE的形式呢?


(1)国际标准IEEE

根据国际标准 IEEE (电气和电子工程协会) 754 ,任意一个二进制浮点数 V 可以表示成下面的形式:

V=(-1)^S * M * 2^E ,为什么是2^E呢?举两个例子:

5000在十进制转化为科学计数法是5*10^3,160在八进制转化为科学计数法是1.6*8^2

那么,这个2 ^ E也不难理解了吧。

(-1)^S表示符号位,显而易见, 当S=0,V为正数;当S=1,V为负数 。

M表示有效数字, M的范围为1<=M<2 ,根据科学计数法和二进制环境(0,1)得出来的结论

2^E表示指数位。

总结: (-1)^S为符号位,M为有效数字,2^E表示指数位

(2)练习:

将以下小数转化为国际标准IEEE的形式

5.5、-9.25、8.75、3.875,-6.125

5.5:第一步,转换为二进制形式:101.1

        第二步,科学计数法,1.011*2²

        第三步,国际标准IEEE,

       不难看出,我们距离国际标准IEEE的 V=(-1)^S * M * 2^E只差符号位的表示,

       这个是正数故S=0,接下来套公式,那么M就是1.011,E就是2即(-1)^0 *1.011* 2^3

       (之后方法笔者就直接简写了,不再赘述)

-9.25:转二进制:-1001.01

           科学计数法:-1.00101*2³

           转IEEE,最后放一次公式,记牢它 V=(-1)^S * M * 2^E

           -9.25是负数,S=1,套公式,M=1.00101,E=3即(-1) ^1 *1.00101* 2^3

8.75:转二进制:1000.11

          科学计数法:1.00011*2³  

          转IEEE,是正数,S=0,M=1.00011,E=3即(-1) ^0 *1.00011* 2^3

          (套公式接下来也不写了,S,M,E才是核心)

3.875:转二进制:11.111(0.5+0.25+0.125=0.875)

            科学计数法:1.1111*2^1

            转IEEE,S=0,M=1.1111,E=1

-6.125    转二进制:110.001

             科学计数法:1.10001*2²

             转IEEE,为负数S=1,M=1.10001,E=2

练习部分就结束了,相信大家对于小数转为 国际标准IEEE的形式已经有所了解,接下来进入本文的重点部分,浮点数在内存中的存储

二、浮点数在内存中的存储

be63ef8d3740486b9705c6187a484539.png

浮点数数据在32位的处理器上最高的1位存放符号位(S)

                                              接着的后8位存放指数位(E)

                                             最后的23位存放有效数字(M)

继续拿5.5举例,5.5转IEEE: (-1)^0 *1.011* 2^3不难看出第一个字节将会存放数字0

                                                                             接着的八个字节会存放3

                                                                             最后的23个字节存放1.011

浮点数据在64位处理器,最高的1位是符号位S,

                                       接着的 11 位是指数 E ,

                                       剩下的 52 位为有效数字 M 。

(1)关于S的存放

这个没什么好说,直接放进去就是

(2)关于E的存放

因为指数可以是负数,所以在进行存放之前会加一个中间值,这个中间值根据32位处理器和64位处理器分别是 127和1023

在二进制转换后

情况1: E不全为0且不全为1

在取出E的数据后(即转换为十进制后)-127或减1023即可

情况2: E全为0

这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,

有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于

0的很小的数字。

情况3:E全为1

这个时候就是根据正负号分别是无穷大,无穷小

(3)关于M的存放

IEEE 754 规定,在计算机内部保存 M 时,默认这个数的第一位总是 1

因此可以被舍去,只保存后面的 xxxxxx部分。

比如保存 1.01(5.5十进制) 的时候,只保存01 ,等到读取的时候,再把第一位的 1 加上去。这样做的目的,是节省 1 位有效数字。

那么不难理解,23位可以存放23个数字,也就是小数点后至多可以存放23位数字

那么再加上之前舍弃的1,就可以存放24位的数据

到这里,今天的分享就结束了,祝友友们前程似锦O(∩_∩)O


相关文章
|
3月前
|
存储 C++
看完就等于拿捏浮点数在内存中的储存了
看完就等于拿捏浮点数在内存中的储存了
59 2
看完就等于拿捏浮点数在内存中的储存了
|
3月前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
186 1
|
3月前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
3月前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
3月前
|
存储 编译器
数据在内存中的存储
数据在内存中的存储
50 4
|
3月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
71 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
3月前
|
存储 机器学习/深度学习 人工智能
数据在内存中的存储
数据在内存中的存储
|
3月前
|
存储 C语言
深入C语言内存:数据在内存中的存储
深入C语言内存:数据在内存中的存储
|
3月前
|
存储
整型在内存中的存储
本文详细解释了计算机中整型数据的三种二进制表示方法:原码、反码和补码,并展示了如何将正数和负数的原码转换为反码和补码。
46 0
|
5月前
|
存储 监控 Docker
如何限制docker使用的cpu,内存,存储
如何限制docker使用的cpu,内存,存储