浮点数转换为二进制存储

浮点数转换为二进制存储

根据IEEE754标准,单精度float类型使用32比特存储,其中1位表示符号,8位表示指数,23位表示尾数;双精度double类型使用64比特存储,1位符号位,11位指数位,52位尾数位。

尾数:M是一个二进制小数,因为是二进制,所以科学计数法中这个值范围是:1≤M

尾数:M是一个二进制小数,因为是二进制,所以科学计数法中这个值范围是:1≤M

IEEE754对有效数字M和指数E,还有一些特别规定。1≤M<2,也就是说,M可以写成1.xxxxxx的形式,其中xxxxxx表示小数部分。IEEE754规定,在计算机内部保存 M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01B的时候,只保存01B,等到读取的时候,再把第一位的1加上去。

单精度浮点数最小正整数为M=0.000 0000 0000 0000 0000 0001B

1/(2^23)=0.0000001192,所以十进制单精度浮点数的有效位数只有7位;

当M=1111111111111.0000000001B=8191.00098,可精确到0.001

当M=11111111111111.000000001B=16383.0019

当M=111111111111111.00000001B=32767.0039

当M=1111111111111111.0000001B=65535.0078,可精确到0.01

当M=11111111111111111.000001B=131071.016

当M=111111111111111111.00001B=262143.031

当M=1111111111111111111.0001B=524287.063,可精确到0.1,有效位数为7位

当M=11111111111111111111.001B=1048575.142,可精确到1,有效位数为7位

双精度浮点数最小正整数为

M=0.0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001B

1/(2^52)=0.0000,0000,0000,000,222,所以十进制双精度浮点数的有效位数只有16位

1将“二进制的浮点数”转换浮点数:

在上图中

指数为0111 1100B,对应的十进制数124,则二进制指数为124-127=-3

尾数为0.01B,则M=1.01B

浮点数值为1.01B*[2(-3)]=0.00101B=1/8+1/32=0.15625

2、单精度浮点数转换为二进制存储:

十进制数78.375=78+0.375

整数十进制数78=100 1110B

小数十进制数0.375=3/8=1/4+1/8=2^(-2)+ 2^(-3)=0.011B

十进制数78.375=100 1110B+0.011B=100 1110.011B=1.001110011B*(2^6)

十进制数78.375在计算机中以二进制存储,

指数为6,则6+127=133=1000 0101B,

尾数为0.001110011B

因此符号为0,指数8位为1000 0101B,尾数23位为00111001100,0000,0000,0000;

十进制数0.5=0+0. 5

整数十进制数0=0B

小数十进制数0.5=1/2=2^(-1)=0.1B

十进制数0.5=0B+0.1B=0.1B=1.0B*[2^(-1)]

十进制数0.5在计算机中以二进制存储,

其指数为-1,则-1+127=126=0111 1110B,

尾数为0.0B

因此符号为0,指数8位为0111 1110B,尾数23位为000,0000,0000,0000,0000,0000;

3、双精度浮点数转换为二进制存储:

十进制数78.375=78+0.375

整数十进制数78=100 1110B

小数十进制数0.375=3/8=1/4+1/8=2^(-2)+ 2^(-3)=0.011B

十进制数78.375=100 1110B+0.011B=100 1110.011B=1.001110011B*(2^6)

十进制数78.375在计算机中以二进制存储,

指数为6,则6+1023=1029=100 0000 0101B,

尾数为0.001110011B

因此符号为0,

指数11位为100 0000 0101B

尾数52位为001110011000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000;

十进制数0.5=0+0. 5

整数十进制数0=0B

小数十进制数0.5=1/2=2^(-1)=0.1B

十进制数0.5=0B+0.1B=0.1B=1.0B*[2^(-1)]

十进制数0.5在计算机中以二进制存储,

其指数为-1,则-1+1023=1022=11 1111 1110B,

尾数为0.0B

因此符号为0,

指数11位为11 1111 1110B

尾数52位为0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000;

union float_define

{

    uint32_t  dat;

    float  f;

};

union float_define   union_float;

union double_define

{

    uint64_t  dat;

    double  f;

};

union double_define   union_double;

void FloatTest(void)

{

    union_float.f=78.375;

    union_float.f=0.5;

}

void DoubleTest(void)

{

    union_double.f=78.375;

    union_double.f=0.5;

}

4、浮点数无法精确表示0,只能近似表示为0.0,永远不可能等于0;

注意:浮点数可以做除数,不用担心为0导致错误;

单精度浮点数0.0

浮点数0的M=1.000,0000,0000,0000,0000,0000B,

为了表示近似等于0,就使用1.000,0000,0000,0000,0000,0000B*[2(-127)]来表示;

浮点数0的指数为-127+127=00000000B,尾数为000,0000,0000,0000,0000,0000B,

因此符号为0,指数8位为00000000B,尾数23位为000,0000,0000,0000,0000,0000B;

编译器采用四舍五入显示,所以这里看到的是0;

双精度浮点数0.0

浮点数0的M=1.0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000B,

为了表示近似等于0,就使用

1.0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000B *[2(-1023)]来表示;

浮点数0的指数为-1023+1023=000,0000,0000B,

浮点数0的尾数为0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000B,

因此符号为0,指数11位为000,0000,0000B,尾数52位

0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000,0000B;

编译器采用四舍五入显示,所以这里看到的是0;

5、十进制整数转换为二进制整数

十进制整数转换为二进制整数:采用“除2取余,逆序排列”法。

6、十进制小数转换为二进制小数

十进制小数转换成二进制小数:采用“乘2取整,顺序排列”法。

单精度浮点数取值范围:

### IEEE 浮点数二进制表示的方法 对于IEEE浮点数标准定义的五种基本格式,其中三种为基于二进制浮点数格式(分别采用32位、64位或128位编码),这里主要讨论最常用的单精度(binary32)和双精度(binary64)两种情况下的转换方法[^1]。 #### 单精度浮点数 (Binary32) 单精度浮点数由三部分组成: - **符号位(Sign bit)**:最高有效位用于指示数值正负;0代表正值,1代表负值。 - **指数位(Exponent field)**:接下来的8位用来存储偏置后的指数。实际使用的指数等于该字段减去一个固定的偏差值\(127\)。 - **尾数(Mantissa/Significand field)**:最后23位保存的是小数形式的小数部分,在计算最终值时会在前面加上隐含的一个整数`1.`作为默认前缀。 因此,要将十进制数转成这种格式,需遵循如下过程: 1. 判断给定实数是正是负来决定S; 2. 将绝对值转化为科学计数法的形式并求得其真指数E以及规范化之后的有效数字M; 3. 对于得到的真实指数加偏移量形成存入字节中的指数域内容; 4. 把去掉前置'1.'后的纯小数部分按顺序填满剩余的空间构成分数区。 例如要把+5.5转化成binary32: ```python import struct def float_to_binary(num): # 使用struct模块打包float为bytes再解包为int从而获取bit pattern [bits] = struct.unpack('!I', struct.pack('!f', num)) return f'{bits:032b}' print(float_to_binary(5.5)) # 输出对应的32-bit模式 ``` 这段Python代码可以实现从浮点数到对应二进制串的快速转换。 #### 双精度浮点数(Binary64) 与上述类似,只不过现在有更宽广的数据范围因为采用了额外的一倍空间。具体来说就是增加了更多比特分配给了各个组成部分——总共64个比特被划分为1位符号位、11位指数位还有52位尾数位。 同样的逻辑适用于此更高精度类型的转换操作上,只是细节上的差异体现在更大的数据宽度之上而已。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值