[计算机基础]浮点数在计算机中的表⽰
⽂章⽬录
参考书籍 《程序是怎样跑起来的》
⼆进制⼩数表⽰
在计算机中,⼀切数据都是以⼆进制的形式进⾏表⽰,⼩数也不例外。
若将⼀个⼗进制的⼩数化为⼆进制⼩数,其简单规则如下图所⽰:
但是像1011.0011这样带⼩数点的表现形式,完全是纸⾯上的⼆进制数表现形式,在计算机内部是⽆法直接使⽤的,且计算机若采⽤定点数的形式来表⽰⼩数的话,则限制了其表⽰范围以及空间分配的不合理;
那么如何更加有效地描述⼩数呢?
浮点数的基本概念
在很多编程语⾔中都提供了两种表⽰⼩数的数据类型,分别是双精度浮点数和单精度浮点数。双精度浮点数类型⽤64位、单精度浮点数类型⽤32位来表⽰全体⼩数。在C语⾔中,双精度浮点数类型和单精度浮点数类型分别⽤double 和float 来表⽰。这些数据类型都采⽤所谓的浮点数来表⽰⼩数。那么,浮点数到底是什么呢?
像这样使⽤与实际⼩数点位置不同的书写⽅法来表⽰⼩数的形式称为浮点数。
与浮点数相对的是定点数,使⽤定点数表⽰⼩数时,⼩数点的实际位置固定不变。例如,⽤定点数来表⽰的话即为123.45和0.012345。
这样,浮点数是指⽤符号、尾数、基数和指数这四部分来表⽰的⼩数。因为计算机内部使⽤的是⼆进制数,所以基数⾃然就是2。
因此,实际的数据中往往不考虑基数,只⽤符号、尾数、指数这三部分即可表⽰浮点数。也就是说,64位(双精度浮点数)和32位(单精度浮点数)的数据,会被分为三部分来使⽤。
IEEE 32 与 IEEE 64
前⾯提到了,在计算机中实际上有两种浮点数标准,分别为双精度浮点数(64位)与单精度浮点数(32位),并且实际存储的内容为符号、指数以及尾数三个部分:
0.12345×10和0.12345×310−10.12345×10和0.12345×310−1
双精度浮点数能够表⽰的正数范围是 ~ ,负数范围是
~。
单精度浮点数能够表⽰的正数范围是 ~ ,负数范围是 ~ 。并且在这些范围中,有些数值是⽆法准确表⽰的,如 0.1 等,故⽽在使⽤浮点数做运算的时候需要额外留意。
符号部分的规则符号部分的规则⽐较简单,⽤1表⽰负数,0表⽰正数。
指数部分的规则
指数部分采⽤"EXCESS"系统表现。
所谓EXCESS是“剩余的”的意思。简单来讲,就是在⼀个范围中到⼀个中间值来表⽰0,那么⼩于这个中间值的为负值,⼤于这个中间值的为正值。
使⽤这种⽅法主要是为了表⽰负数时不使⽤符号位。在某些情况下,在指数部分,需要通过“负xx次幂”的形式来表⽰负数。EXCESS系统
表现是指,通过将指数部分表⽰范围的中间值设为0,使得负数不需要⽤符号来表⽰。
也就是说,当指数部分是8位的单精度浮点数时,最⼤值11111111=255的1/2,即01111111=127(⼩数部分舍弃)表⽰的是0,指数部分是11位的双精度浮点数时,11111111111=2047的1/2,即01111111111=1023(⼩数部分舍弃)表⽰的是0。
尾数部分的规则
尾数部分使⽤的是将⼩数点前⾯的值固定为1的正则表达式。
4.94065645841247×10−324 1.79769313486232×10308−1.79769313486232×10308−4.94065645841247×10−3241.401298×10−45
3.402823×1038−3.402823×1038−1.401298×10−45
具体来讲,就是将⼆进制数表⽰的⼩数左移或右移(这⾥是逻辑移位。因为符号位是独⽴的“)数次后,整数部分的第1位为1,其他位均为0)。
⽽由于第1位必须是1,第1位的1在实际的数据中⽆需保存。
并且不难理解的是,向左移n次则最终指数部分的实际值为 -n,向右移n次则最终指数部分的实际值为 n。
总结
浮点数的基数什么意思⼩数是以浮点数的形式在计算机中表⽰,⽽浮点数在计算机中的表⽰则通过特定的格式与规则来进⾏
存储:
也正因如此,我们可以知道诸如0.1这种⼩数是⽆法在计算机中准确描述的,所以在遇到浮点数⽐较与计算等问题时,要额外注意出错的情况,能转换成整数运算的尽量转换成整数运算。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论