《C语言编程魔法书:基于C11标准》——2.3 浮点数在计算机中的表示

2.3 浮点数在计算机中的表示

当前主流处理器一般都能支持32位的单精度浮点数与64位的双精度浮点数的表示和计算,并且能遵循IEEE754-1985工业标准。现在此标准最新的版本是2008,其中增加了对16位半精度浮点数以及128位四精度浮点数的描述。C语言标准引入了一个浮点模型,可用来表达任意精度的浮点数,尽管当前主流C语言编译器尚未很好地支持半精度浮点数与四精度浮点数的表示和计算。关于C语言标准对浮点数的描述,我们稍后将在5.2节做更详细的介绍。
为了更好地理解IEEE754-1985中规格化(normalized)浮点数的表示法,我们先来介绍一下浮点数用一般二进制数的表示方法。一个浮点数包含了整数部分和尾数(即小数)部分。整数部分的表示与我们之前所讨论过的一样,第n位就表示2n,n从0开始计。而尾数部分则是第m位表示2-m,m从1开始计。对于一个0101.1010的二进制浮点数对应十进制数的计算如图2-7所示:

图2-7中,整i位即表示第i位整数;尾i位即表示第i位尾数。其中,第3位整数为最高位整数;第4位尾数表示最低位尾数。对二进制浮点数的表示有了概念之后,我们就可以看IEEE754-1985标准中对规格化浮点数的描述了。IEEE754-1985对32位单精度与64位双精度两种精度的浮点数进行描述。32位单精度浮点可表示的数值范围在±1.18×10-38到±3.4×1038,大约含有7位十进制有效数;64位双精度浮点可表示的数值范围在±2.23×10-308到±1.80×10308,大约含有15位十进制有效数。我们看到IEEE定义的浮点数的绝对值范围可以是一个远大于1的数,也可以是一个大于零但远小于1的数,即它的小数精度是可浮动的,所以称之为浮点数。如果说是定点数的话,它也可表示一个小数,但是其整数位数与小数位数的精度都是固定的。比如一个16.16的定点数表示整数部分采用16个比特,尾数部分也采用16个比特。而对于一个32位浮点数来说,既能使用16.16的格式,也能使用30.2的格式(即30个比特表示整数,2个比特表示尾数)或其他各种形式。而IEEE754-1985对规格化单精度浮点数的格式如下定义:
1)1位符号位,一般是最高位(31位),表示正负号。0表示正数,1表示负数。
2)8位指数位,又称阶码,位于23到30位。(阶码的计算后面会详细介绍。)
3)23位尾数,位于0到22位。
我们下面举一个实际的例子来详细说明一个十进制小数5.625如何表示成IEEE754标准的规格化32位单精度浮点数。
1)5.625是一个正数,所以符号位为0,即第31位为0。
2)我们将5.625依照图2-7那样写成一般小数的表示法——0101.101。
3)我们将此二进制浮点数用科学计数法来表示,使得二进制整数位为最高位的1。这里最高位为1的比特是从左往右数是第二个比特,所以将小数点就放到该比特的后面,得到1.01101×22。二进制数的科学记数法,底数的值显然就是2。
4)此时,我们能看到尾数部分是小数点后面的那串二进制数,即01101,而指数为2。现在我们来求阶码。阶码用的是中经指数偏差(exponent bias)处理后的指数,即用上述得到的指数加上偏差值所求得的和。IEEE754在单精度浮点中规定,偏差值为127。所以本例中,阶码部分为2+127=129,用二进制数表示就是1000 0001。
5)尾数部分从大到小照抄,低位的用0填充即可,所以这里的尾数部分二进制数为:011 0100 0000 0000 0000 0000。
6)将整个处理完的二进制数串起来获得:0(符号位)1000 0001(阶码)011 0100 0000 0000 0000 0000(尾数),用十六进制数表达就是:40B4 0000。
十进制小数转64位双精度浮点数的方法与上述雷同,只不过阶码用11位比特来表示,尾数则用52位比特表示,而偏差值则规定为1023。

时间: 2024-09-20 00:48:24

《C语言编程魔法书:基于C11标准》——2.3 浮点数在计算机中的表示的相关文章

《C语言编程魔法书:基于C11标准》—— 导读

前 言 为什么要写这本书 本人在2001年上了大学本科,读计算机科学与技术专业.在第一年的上半学期,对计算机编程还没什么感觉.但是就在考"C语言程序设计"这门专业课的前一个月,感觉这门课学了那么久几乎什么都不会,可把我急坏了.然后就在这短短一个月的时间里又是看书,又是上机实验,终于考了70多分,算是过关了--不过奇怪的是在考试结束后,就发现自己对编程有了感情.到了大二,我们上"数据结构"所使用的教材是基于C++编程语言的,因为之前没学过C++语言,所以只能自学.而在

《C语言编程魔法书:基于C11标准》——导读

前 言 为什么要写这本书 本人在2001年上了大学本科,读计算机科学与技术专业.在第一年的上半学期,对计算机编程还没什么感觉.但是就在考"C语言程序设计"这门专业课的前一个月,感觉这门课学了那么久几乎什么都不会,可把我急坏了.然后就在这短短一个月的时间里又是看书,又是上机实验,终于考了70多分,算是过关了--不过奇怪的是在考试结束后,就发现自己对编程有了感情.到了大二,我们上"数据结构"所使用的教材是基于C++编程语言的,因为之前没学过C++语言,所以只能自学.而在

《C语言编程魔法书:基于C11标准》——2.9 本章小结

2.9 本章小结 本章大致介绍了计算机体系结构以及程序执行的大致流程,然后描述了整数以及浮点数在计算机中的存储方式,之后还介绍了地址与字节对齐.字符编码.处理器大端与小端字节序,以及按位逻辑运算和移位操作.由于这些知识都是学习C语言必备的,C语言中有相关语法与这些概念对应,所以各位最好能先理解.掌握这些基本知识,这样对后续学习C语言将有很大帮助.

《C语言编程魔法书:基于C11标准》——第3章 C语言编程的环境搭建3.1 Windows操作系统下搭建C语言编程环境

第3章 C语言编程的环境搭建 我们在第2章讲述了学习C语言所必需的一些预备知识.本章将给大家介绍常用桌面操作系统下的C语言环境搭建.这里所讲述的C语言编译器以及集成开发环境(IDE)都是可合法免费下载的,本书不鼓励各位使用盗版或破解软件,所以下面会列出下载这些合法免费软件的官方链接,大家把编程环境搭建完之后即可上机实践编程. 3.1 Windows操作系统下搭建C语言编程环境 Windows操作系统下默认不自带任何C语言编译器,大家必须从网上下载自己所需要的C语言编译器.如果各位想通过C语言开发

《C语言编程魔法书:基于C11标准》——第一篇 预备知识篇 第1章 C魔法概览1.1 例说编程语言

第一篇 预备知识篇 第1章 C魔法概览 本章内容主要对C编程语言(以下简称C语言)进行大体介绍,包括它的历史以及C语言标准的演化进程.然后介绍一下C语言编程思想,当前主流C语言编译器以及GNU语法扩展.最后简单介绍一下从用C语言编写程序到编译.构建一个可执行程序的大致过程. 计算机编程语言从对计算机硬件底层的抽象程度进行分类,可分为:机器语言.汇编语言以及高级语言.下面由底层到高层分别介绍这几种类别的编程语言. 1.1 例说编程语言 1)机器语言是直接通过十六进制数表示当前处理器架构的机器指令码

《C语言编程魔法书:基于C11标准》——第一篇 预备知识篇 第1章 C魔法概览 1.1 例说编程语言

第一篇 预备知识篇 第1章 C魔法概览 本章内容主要对C编程语言(以下简称C语言)进行大体介绍,包括它的历史以及C语言标准的演化进程.然后介绍一下C语言编程思想,当前主流C语言编译器以及GNU语法扩展.最后简单介绍一下从用C语言编写程序到编译.构建一个可执行程序的大致过程. 计算机编程语言从对计算机硬件底层的抽象程度进行分类,可分为:机器语言.汇编语言以及高级语言.下面由底层到高层分别介绍这几种类别的编程语言. 1.1 例说编程语言 1)机器语言是直接通过十六进制数表示当前处理器架构的机器指令码

《C语言编程魔法书:基于C11标准》——1.3 主流C语言编译器介绍

1.3 主流C语言编译器介绍 对于当前主流桌面操作系统而言,可使用Visual C++.GCC以及LLVM Clang这三大编译器.其中,Visual C++(简称MSVC)只能用于Windows操作系统:其余两个,除了可用于Windows操作系统之外,主要用于Unix/Linux操作系统.像现在很多版本的Linux都默认使用GCC作为C语言编译器.而像FreeBSD.macOS等系统默认使用LLVM Clang编译器.由于当前LLVM项目主要在Apple的主推下发展的,所以在macOS中,Cl

《C语言编程魔法书:基于C11标准》——1.4 关于GNU规范的语法扩展

1.4 关于GNU规范的语法扩展 GNU是一款能用于构建类Unix操作系统的计算机软件合集,由自由软件之父Richard Stallman开创,于1983年9月27日对外发布.GNU完全由自由软件(free software)构成.GNU语法扩展源自于GCC编译器,在1987年发布1.0版本,称为GNU C Compiler.随后,GCC编译器前端支持了C++.Objective-C/C++.Fortran.Ada.Java以及最近跃升的Go等编程语言,因此现在GCC被称为GNU Compile

《C语言编程魔法书:基于C11标准》——1.2 用C语言编程的基本注意事项

1.2 用C语言编程的基本注意事项 C语言的发明其实基于Unix操作系统.当时在C语言未面世之前,Dennis Ritchie所在的AT&T贝尔实验室用的Unix系统是完全用汇编语言写的.汇编语言的优势是直接面向处理器本身,能直接对底层硬件进行控制,充分发挥处理器的硬件能力.然而,它的缺陷也是显而易见的. 1.汇编语言的不足 首先,不可移植性.每种处理器,其指令集都大相径庭,比如ARM有ARM的指令集架构(ISA),Intel x86有x86的ISA,还有MIPS.Power(原来为PowerP