十进制小数转 IEEE 754 单精度浮点数

来自姬鸿昌的知识库
跳到导航 跳到搜索

https://m.toutiao.com/is/6L1e1xe/

https://www.youtube.com/watch?v=8afbTaA-gOQ

例如:178.125


1、分别把浮点数的整数部分和小数部分转换成2进制

整数部分:

178/2=89…0

89/2=44…余1

44/2=22…余0

22/2=11…余0

11/2=5…余1

5/2=2…余1

2/2=1…余0

1/2=0…余1

逆序排列,所以(178)10的二进制是(10110010)2


小数部分:

0.125*2=0.25…取整数部分0

0.25*2=0.5…取整数部分0

0.5*2=1…取整数部分1

顺序排列,所以(0.125)10=(0.001)2


合起来即是:10110010.001


2、转换成计算机存储形式的二进制浮点数

把小数点移动到整数位只有1,即为:1.011 0010 001 * 2111,基数2的指数111是二进制,换算成十进制为7,因为小数点左移了7位,所以是111。


3、阶码(指数)

阶码(指数)的计算公式:

阶数(指数)+偏移量(单精度浮点数指数偏移值是127)

其中偏置值的计算是:2e-1,比如单精度浮点数的阶码占8位,要作为一个无符号整数存储阶码的话,就是28-1=127;

以 01111111 作为指数 0;阶码大于 01111111 指数为正;阶码小于 01111111 指数为负。

即:(111)2 + (01111111)2=(1000 0110)2,也就是(7)10+(127)10=(134)10


4、尾数

小数点后面的数,即 011 0010 001

小数点前面的1去哪里了?由于尾数部分是规格化表示的,最高位总是1,所以省略不存。这样尾数部分就可以多存1位、提高精度。


5、符号位

由于 178.125 是正数,故为0(负数为1)


6、结果

最终结果为

(178.125)10 IEEE 754 单精度浮点数的二进制存储
1位 符号位 8位 阶码(指数) 23位 尾数(省略了最高位二进制整数部分的1)2^23=8388608
全局序列 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
局部序列 1 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
二进制值 0 1 0 0 0 0 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0

单精度浮点数为32位,不够32位后面补0。

注意:

其中尾数部分23位 (8388608)10,

也就是说存储的十进制数的小数点后面最大就是 8388608,7位小数,不够的换成 双精度 double,尾数52位,可以存储 (4503599627370496)10,15、16位小数


7、验证

https://www.bilibili.com/video/BV1F741137za

public class Test {

    public static void main(String[] args) {
        //符号位_阶码_尾数码
        int i = 0b0_10000110_01100100010000000000000;
        System.out.println(Float.intBitsToFloat(i));
        //output: 178.125
    }
}