浮点数在内存中的存储

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

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

一个小数,如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


相关文章
|
7天前
|
存储 Java C++
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据,如局部变量和操作数;本地方法栈支持native方法;堆存放所有线程的对象实例,由垃圾回收管理;方法区(在Java 8后变为元空间)存储类信息和常量;运行时常量池是方法区一部分,保存符号引用和常量;直接内存非JVM规范定义,手动管理,通过Buffer类使用。Java 8后,永久代被元空间取代,G1成为默认GC。
18 2
|
10天前
|
存储
数据在内存中的存储(2)
数据在内存中的存储(2)
24 5
|
10天前
|
存储 小程序 编译器
数据在内存中的存储(1)
数据在内存中的存储(1)
27 5
|
11天前
|
存储 安全 Java
SpringSecurity6从入门到实战之初始用户如何存储到内存
Spring Security 在 SpringBoot 应用中默认使用 `UserDetailsServiceAutoConfiguration` 类将用户信息存储到内存中。当classpath有`AuthenticationManager`、存在`ObjectPostProcessor`实例且无特定安全bean时,此配置生效。`inMemoryUserDetailsManager()`方法创建内存用户,通过`UserDetails`对象填充`InMemoryUserDetailsManager`的内部map。若要持久化到数据库,需自定义`UserDetailsService`接口实
|
10天前
|
存储 编译器 C语言
数据在内存中的存储
数据在内存中的存储
17 2
|
9天前
|
存储
数据在内存中的存储(了解数据在内存中的存储规则,看这一篇就够了!)
数据在内存中的存储(了解数据在内存中的存储规则,看这一篇就够了!)
|
6天前
|
存储 C语言
【C语言进阶篇】整数在内存的存储——原码、反码、补码
【C语言进阶篇】整数在内存的存储——原码、反码、补码
|
9天前
|
存储 C语言
C语言----数据在内存中的存储(2)
C语言----数据在内存中的存储
14 0
|
9天前
|
存储 C语言
C语言----数据在内存中的存储(1)
C语言----数据在内存中的存储
|
9天前
|
存储 C语言
C语言---求一个整数存储在内存中的二进制中1的个数--3种方法
C语言---求一个整数存储在内存中的二进制中1的个数--3种方法