c语言 计算浮点数尾码阶码代码,详谈IEEE浮点数编码机制

本文深入探讨了浮点数在计算机底层的表示方式,特别是IEEE浮点数编码机制。通过二进制小数的原理,解释了浮点数的组成部分——尾数和阶码的计算,以及IEEE 754标准下的单精度和双精度浮点数表示。此外,文章还介绍了非规格化数、规格化数的转换和平滑过渡,以及特殊值如无穷和NaN的表示。
摘要由CSDN通过智能技术生成

在一些工程领域中单单依靠整数是无法满足他们对精度的需求的,这种时候就需要用到浮点数了。今天着重来聊一聊在计算机底层,浮点数的编码方式,以及它相关值的计算方式。

二进制小数

在介绍浮点数之前先来看看二进制中实数可以如何表示。假设我有一个十进制的小数8.33,那么它的值可以表示为

8 + 3 / 10 + 3 / 100 = 833 / 100

复制代码

各个位的权重依次是10 ^ 0 = 1, 10 ^ -1 = 0.1, 10 ^ -2 = 0.01。其实二进制小数也是类似的,只不过它是逢二进一。考虑这个二进制串1001.1111,它所能够代表的十进制数字是多少呢?简单地可以把它分成整数部分1001以及小数部分1111。

整数部分

整数部分的计算很容易了,在不考虑符号的情况下依次代入相关的权重即可

1 * 2 ^ 3 + 0 * 2 ^ 2 + 0 * 2 ^ 1 + 1 * 2 ^ 1 = 9

复制代码

小数部分

小数部分其实类似,只不过相关的权重需要稍微调整一下。

1 * (2 ^ -1) + 1 * (2 ^ -2) + 1 * (2 ^ -3) + 1 * (2 ^ -4) = 1 / 2 + 1 / 4 + 1 / 8 + 1 / 16 = 15 / 16

复制代码

再换个角度去看这个小数的部分,其实它还等价于1111 / 10000。

(1 * 2 ^ 3 + 1 * 2 ^ 2 + 1 * 2 ^ 1 + 1 * 2 ^ 0) / (2 ^ 4) = 15 / 16

复制代码

就是先计算二进制串1111的值,再把它的小数点往左移动4位,因此需要除以2 ^ 4。结合整数部分以及小数部分,可以得到最终结果9 + (15 / 16) = 159 / 16。

如果用已有的二进制编码知识来表示数值159 / 16,那么只需要分配一段内存区域来存储159的二进制串10011111,然后再利用另一段区域来存储小数点相关的偏移量00000100即可。不过这种方式灵活性比较低,所能够表示的数值范围也十分有限。那么接下来看看现代机器中浮点数是如何表示的。

IEEE浮点数

基于前面所谈到的原理,了解IEEE浮点数就不是什么大问题了。IEEE浮点数是一个工业上的标准,根据标准来设计的机器彼此之间的兼容性会比较高。

基本原理

IEEE浮点数的计算方式稍微有点麻烦,不过原理十分简单,说白了就是科学计数法。假设我有一个十进制小数100.2那么其实这个数可以表示为0.1002 * (10 ^ 2),可以简单地

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值