首页 > 编程知识 正文

计算机定点数和浮点数(计算机定点数储存原理)

时间:2023-05-04 11:02:52 阅读:104793 作者:3448

实数在日常开发中使用较多。比如电商商品的价格一般是9.9元。

浮点数的不精确性

你能用二进制表示所有的实数,然后用二进制计算它们的加减乘除吗?

打开Chrome的控制台,输入“0.3 0.6”的结果:

这么简单的加法,在JavaScript中,计算出来的结果其实不是精确的0.9,而是0.9999,为什么呢?

计算机通常用16/32位来表示一个数字。那32位能代表所有的实数吗?显然不是。32位只能代表2.32的数字,差不多是40亿。超过这个数,两个不同的数将具有相同的二进制表示。计算机不会知道这个数字是多少。

40亿的数字看似很多,但与无限多的实数相比是很小的。最后,这40亿个数字应该映射到实数集中的哪些数字上,才能在实际应用中最有价值?

定点数

直观的思路,用4位来表示从0到9的整数,那么32位就可以表示8个这样的整数。然后取最右边0到9的两个整数作为小数部分;取左边6个从0到9的整数作为整数部分。这样,我们可以用32位来表示从0到999999.99的1亿个实数。

这种十进制编码的二进制表示称为BCD编码(二进制编码十进制)。它最常用于超市和银行,在那里需要以小数位记录金额。超市的小数是最精确的。这种表达方式直观明了,可以满足小数部分的计算。

00-1010浪费了32位。我们可以代表40亿个不同的数字,但在BCD编码下,我们只能代表1亿个数字。精确到分钟,可以表示的最大金额是100万。如果货币是人民币或美元,津巴布韦货币的数量将不够。不能同时代表一个大数和一个小数。有时候我们想表示商品的数量,关心9.99这样的小数字。有时候在物理运算中,需要表示光速,也就是310 ^ 83108这么大的数字。有没有既能表示小数字又能表示大数字的方法?00-1010是浮点型,即浮点型。

在便利贴上,写一行十进制数字。你能写下什么范围的数字?为了让人们看得清楚,文字的最小尺寸也有限制:纸张的宽度限制了我们可以表达的数量。如果宽度只有8位数的空间,最多只能写99999999。

这里,纸张宽度,像32位一样,在空间级别受到限制。现实如何代表一个庞大的数字?如果你想在一本科普书里写下宇宙中原子的数量,有没有可能在一页多行的纸上写下很多零呢?

不,我们将使用科学符号,如1.010 ^ 82,而不是写82个零。计算机也可以用类似的方法,通过科学计数来表示实数。浮点数的科学表示法,有一个IEEE标准,它定义了两种基本格式:

32位代表单精度浮点数,即浮点或浮点32型64位代表双精度浮点数,也就是我们通常所说的双精度或浮点64型单精度32位可以分为三部分。第一部分是符号位,表示正数或负数。一般用s表示。在浮点数中,我们不像一个正符号数或一个无符号数。所有浮点数都是有符号的。由8位组成的指数位。一般用e表示,8位可以表示的整数空间为0 ~ 255。这里,1 ~ 254被映射为254个正数和负数-126 ~ 127。浮点数,不仅想表示大数,还希望表示很小的数,所以指数位也有负数。不使用0和255。是的,这里的0(即所有8位都是0)和255(即所有8位都是1)用于其他目的。23位有效数字。用f表示的科学计数法的浮点数是(-1) s 1.f 2 e (1) s 1.f 2e。

这里的浮点数不能表示0。要表示0和一些特殊的数字,请使用E中左边的0和255,它们实际上是标记位。当e=0 f=0时,这个浮点数被认为是0:

比如0.5的符号S应该是0,F应该是0,E应该是-1,也就是

0.5=(-1)01.02 {-1 }=0 . 50 . 5=(1)01.021=0.5,对应的浮点数表示是32位。

S=0,e=2 {-1} S=0,e=21。需要注意的是,e表示从-126到127,其中-1是第126位。如果这里的e表示为整数,它是2 62 52 42 3 2 22 1=12626。

在这种浮点表示下,无论符号如何,浮点数能表示的最小数和最大数分别为1.1710 {-38 } 1.1710383.4010 { 38 } 3.401038。

它比以前的BCD编码所能表达的要大得多。

00-1010,浮点数可以表示的数据范围突然变得大了很多。因为这个数对应的小数点的位置是“浮点数”,所以叫浮点数。随着指数e值的不同,小数点位置也在移动。相应的,前面BCD编码的实数是小数点固定在某个地方的方式,所以我们也称之为定点数。

为什么0.3 0.6得不到0.9?因为浮点数不能准确表示0.3、0.6和0.9。9个数字0.1 ~ 0.9中,只有0.5能准确表示为二进制浮点数:s=0,e=-1,f=0。

0.3、0.6和0.9只是近似表达式。无论浮点数是表示还是计算,都是近似计算。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。