5.6.1_浮点数的表示

简介: 计算机组成原理之浮点数的表示

一、引子

通过之前几个小节的学习,我们已经知道了定点数怎么在计算机里表示,包括定点整数和定点小数。

从这个小节开始,我们要学习浮点数在计算机里的表示和运算。这个小结中,我们先介绍浮点数如何表示。
image.png

我们会介绍浮点数它有什么作用,还有一个基本的原理。另外,考试中常考的一个问题是浮点数的规格化。最后,我们还会简单地介绍浮点数的表示范围相关的问题。这方面的内容其实已经从考研大纲里边删除了。所以关于浮点数的表示范围,我们只做一个简要的了解。

二、定点数的局限性

首先来看一下我们之前学习的定点数它有什么局限性

来看这样的一个故事,我现在的财富净值是-8540 块钱,为什么是一个负值?因为今天刚好是我的蚂蚁花呗的还款日。我的这些财富,这些净资产其实可以用一个 2 字节的 short 短整型变量就可以表示。
image.png

两个字节表示我的财富绰绰有余。虽然我很穷,然而我的贫穷又造就了有些人的富裕,比如马爸爸,他的财富有 3000 多个亿。你会发现他的财富用一个 4 字节的 Int 形变量都是表示不了的,已经超出了 4 字节定点整数所能表示的范围。
image.png

所以我们只能用一个 8 字节的long型定点整数来表示它的财富。

然而,如果我们把这么多的人民币换成津巴布韦币,那一块钱的人民币差不多是约等于 10 的 10 次方这么多的津巴布韦币,所以把这些钱全部换成津巴布韦币的话,那 8 个字节的long型定点整数同样是表示不了的。
image.png

我们在生活当中难免会遇到这种数字超级大的情况。

虽然这些数字和我们都没有太大的关系,但是我们终归想要用计算机来表示这些数字。而我们的定点数、定点整数和定点小数,在字节数固定的情况下,其实数字的表示范围是很有限的,但我们又不能无限制地来增加定点数的长度。

就像刚才这个例子一样, 2 字节到 4 字节再到 8 字节还要继续往上涨,就没完没了。所以这就是定点数的局限性。

浮点数就是为了解决这样的问题,当我们表示数据的二进制位数不变的情况下,我们如何来增加数据的表示范围?这就是浮点数要解决的事情。

三、从科学计数法理解浮点数

(1)十进制

计算机里的浮点数和我们小时候学习的科学计数法,它们的思想其实是相通的。所以我们会尝试着从大家熟悉的科学计数法来一步一步的往浮点数那边靠。

还是看之前这个数字,如果采用科学计数法来记录这些数字,可以把它记成正的 3. 026 乘以 10 的 11 次方。

当然这个地方我们省略了一些尾数,不过这些尾数的省略对于整体的数值来说其实影响不大,也就是 5000 多万而已,我们把它抛掉就可以。
image.png

我们使用科学计数法来表示一个数的时候,其实底数 10 是不会变的。

既然底数一定是 10 固定不变,所以我们采用科学计数法记录这个数字的时候,不记录 10 也是 OK 的。

比如我们可以采用这样的形式,用前边的三个位置(蓝色部分)表示10 的多少次方,用后边的五个位置(一个符号四个数字)来表示尾数到底是多少。如下:
image.png

用这样的方式,我们就不用再写底数到底是多少了。

我们不妨给这两个部分取两个名字。
image.png

①左边蓝色的部分称为阶码,表示这是 10 的多少次方。阶码由阶符还有数值部分组成。阶符为正,就意味着我们需要把小数点往后移。如果阶符为负,就意味着我们需要把小数点往前移。

而阶码的数值部分又指明了小数点要移动多少位。
image.png

②右边绿色这个部分,我们给它取一个名字,叫做尾数

尾数同样有一个正负的符号,这个符号表示了整个数值的正负性。后边这些数字我们把称为尾数的数值部分。显然,尾数的数值部分越短,科学计数法它能表示的数字精度越低。

像刚才被我们舍弃了末尾的这些数,散失了一些精度。如果我们能够增加尾数的数值部分,再增加两个位57,这样我们表示的数字精度就上升了。
image.png

所以采用科学计数法,如果我们把这堆钱换成津巴布韦币,很简单,我们只需要让阶码再加 10 就可以。
image.png

在阶码和尾数的长度保持不变的情况下,我们采用这种方法来表示数字,它的表示范围增加了很多。

阶马部分反映了数值的大小,尾数部分反映了数值的精度

这是大家熟悉的十进制科学计数法。

(2)二进制

1.定点数

现在我们来看一下在计算机里二进制的浮点数它是什么原理,以前我们学了二进制的定点数,定点数的小数点位置是固定不变的。
image.png

比如用定点数表示的小数,一般来说,会默认小数点固定在符号位的后面这个位置。定点整数,我们会默认小数点固定在数值位的最后面这个位置。如下:
image.png

因为小数点的位置固定不变,所以我们才把它称为定点数。

2.浮点数

浮点数的表示

浮点数就是指小数点的位置是会浮动的,具体浮动多少,其实看阶码到底是多少。

用二进制表示的浮点数阶码通常会使用补码或者移码的方式来表示,并且阶码是一个定点整数;而尾数部分通常是用原码或者补码表示的定点小数
image.png

二进制浮点数的真值应该怎么确定?

用这样的一个式子就可以确定。
image.png

同样的,我们还是类比大家熟悉的十进制科学计数法,会更容易理解。

我们把这阶码的真值记为E,把尾数的真值记为M。那么二进制浮点数它的真值我们就可以用 r 的 E 次方乘以M这样的方式来确定。
image.png

这个地方的 r 就是阶码的底数,我们通常会取2。

就有点类似于十进制里边我们把阶码的底数取为10,因为我们给定了一个十进制小数之后,这个小数乘以 10 的 E 这么多次方。

这就意味着要基于我们给出的小数来移动小数点,移动 E 这么多位。具体是后移还是前移,其实就要看阶码的符号为正还是为负。
image.png

而对于二进制浮点数来说,我们把阶码的底看作是2,假设此时的阶码是1,再乘以给出的定点小数M,比如 M 是零点某某这样的一个数。定点小数乘以 2 的 1 次方,就意味着我们需要把尾数让它的小数点后移一位,或者换一种说法,让尾数算术左移一位。
image.png

所以这部分的内容我们来类比十进制科学计数法,就会很好理解。

另外一点可以补充一下,我们通常是默认阶码的底为2,但是除了 2 之外,其实也可以取 2 的 i 次方,这样比如可以取4,可以取8。
image.png

如果要类比十进制,类似于十进制科学计数法当中,通常我们会默认底是 10 。但是我们也可以取 10 的二次方也就是取 100 ,或者 10 的三次方也就是取1000。
image.png

如果阶码的底变成了 10 的二次方,也就是变成了100,就意味着 1 的阶码会对应小数点后移两次;如果阶码为2,而阶码的底为100,就意味着小数点需要后移4位。

所以大家看课本的时候会发现,课本里边告诉我们阶码的底也可以取 4 取8。 这个原理大家可以和刚才提到的十进制科学计数法进行一个类比。
image.png

当然了,通常来说阶码都是2,很少会遇到其他的情况。

接下来如果没有特别强调,我们就默认阶码的底就是2


补充

image.png

①第一句话

阶码 E 的值反映了浮点数的表示范围,还有小数点的实际位置

反映了小数点的实际位置很好理解,怎么理解它反映了浮点数的表示范围呢,我们同样还是用十进制科学计数法来类比。

假设我们规定这儿给出的十进制的阶码只能有两位,两个数字再加一个符号位,这就意味着可以表示的十进制阶码的范围只能是 0 到99,

所以当尾数确定的时候,我们所能表示的数,它最大的范围能到乘以 10 的 99 次方,最多只能表示这么多。因为阶码规定不能超过 2 位。
image.png

回到二进制浮点数也是类似的。阶码它的位数是固定的,它的值也只能表示某一个范围的数。而阶码的表示范围就反映了浮点数的表示范围。

②第二句话

第一句话应该理解了。

第二句话尾数 M 的数值部分,它的位数 n 反映了浮点数的精度。这点也和十进制一样。

如果我们规定尾数的长度就只能有这么多个数字,它所能表示的精度就是有限的。对于二进制浮点数来说也一样,尾数越长,我们可以表示的精度肯定会越高,尾数越短,精度就会越小。

总之,对于二进制的浮点数来说,尾数是用原码或者用补码表示的一个定点小数,它给出了一个小数阶码的真值,又反映了在定点小数的基础上,小数点应该前移或者后移多少位。
image.png

练习

接下来看一个题来练习一下。

假设阶马和尾数在这地方都是用补码的形式给出的,求 a 和 b 这两个浮点数的真值。
image.png

这儿我们用分号把阶码和尾数进行了一个分隔。

阶码这个地方我们是用了一个小逗号来区分符号位,因为阶码一定是一个整数,所以我们使用逗号来分隔。

尾数部分由于是一个小数,所以我们这用了一个小数点,小数点前边是符号位,小数点后边是数值位。

①首先来看 a 浮点数。

它的阶码是0,01,这是一个补码,我们把它翻译成对应的真值是+1。

再看它的尾数部分,这个尾数是用补码表示的定点小数。补码转原码,符号位保持不变,数值位全部取反,并且再在末位加1,这就是尾数所对应的原码。
image.png

如果我们用二进制表示,它的增值应该是负的 0. 0111,然后再给每一位按照它的权值进行一个相加的操作。

所以基于浮点数的真值的确认方式。,我们知道 a 的真值应该是等于 2 的一次方,也就是 2 的阶码次方,再乘以它的尾数所表示的真值。

在尾数真值的基础上乘以2,就相当于每一位的位权都乘了 2 。
image.png

每一位的位权乘以2,这就相当于让小数点往后移了一位。或者换一种角度来说,相当于我们把尾数部分表示的定点小数给算数左移了一位。
image.png

所以这就是 a 的真值。当然我们这是用二进制表示,有兴趣的同学也可以把它翻译成十进制,我们这就不做了。

如果我们使用一个字节,也就是使用 8 个比特的空间来存储 a 浮点数,阶码占 3 位,尾数占后边的 5 位,刚好 8 个比特是可以存的下 a 浮点数的。
image.png

②接下来看 b 浮点数。

b 的阶码0,10,这是一个补码,把它翻译成对应的真值应该是+2。

再看尾数,尾数同样是补码,只不过它是一个正值,所以我们可以直接得到它所对应的二进制表示的真值是+0.01001这样的形式。

所以 b 浮点数的真值应该是 2 的阶码次方乘以它的尾数所表示的真值。
image.png

乘以 2 的二次方,就相当于算数左移了 2 位,或者也可以理解为是小数点后移了 2 位,所以与之对应的真值应该是+1.001 。

如果我们采用一个字节,也就是 8 比特的存储空间来存储 b 浮点数,它的阶码占 3 位,但是它的尾数部分占了 6 位。所以最后这一位 1 我们存不下,只能把它抛弃。

然而如果我们把最后 1 抛弃了,就意味着 b 浮点数它的精度就降低了。
image.png

所以能不能把浮点数的表示进行优化,在存储空间不变的情况下,尽可能的多保留它的精度。这个问题就是所谓的浮点数尾数的规格化问题。

四、浮点数尾数的规格化

什么叫规格化?

(1)左规

image.png

1.十进制

我们同样从十进制的科学计数法出发。
如果规定在科学计数法当中,只能用 4 个数字来表示尾数部分。
image.png

上面这个数我们可以把表示为正的 3. 026 乘以 10 的 11 次方,也可以把它表示为下面这种形式, 0. 003 乘以 10 的正 14 次方。

这两个数的区别就是我们损失了后边这几个位的精度,但是实际的数值相差的也不是特别大。

其实我们在小学初中的时候就已经知道了,当我们采用科学计数法的时候,其实科学计数法会规定尾数的最高位必须是一个有效值,也就是最高位不能是0

如果像下面这个例子,前面这些位都是0,这些 0 其实是毫无意义的。所以在尾数的长度规定只能有那么长的情况下,我们一定会尽可能的追求尾数的最高位,它是一个有效值,不能是0。
image.png

这就是十进制科学计数法的规格化。

2.二进制

现在我们把这种思想迁移到二进制的浮点数

对于 b这个数来说,它的尾数部分 0. 0 1001。
image.png

第一个 0 是符号位,我们必须保留,而小数点后面这一位它是0,相当于这是一个无效值,我们完全没有必要记录它。

所以怎么处理?我们可以让尾数部分算数左移一位,或者也可以是让小数点向右移一位,变成这样的值。
image.png

尾数做了这样的处理之后,我们只需要让阶码的值减1,从原来的 2 变为1。

用这样的方式处理, b 的真值是保持不变的。

然而由于我们逻辑左移了一位,抛弃了最高的无效数值位,所以最低位的空位,我们就可以用来记录 1 这个数。
image.png

这样我们就可以保证在浮点数的整体存储空间不变的情况下,尽可能地让它保留更多的精度。

刚才我们这种处理方法,把尾数算数左移了一位,然后阶码减1。
image.png

处理完了之后,尾数的最高数值位现在是一个有效值。

由于是算数左移,所以我们把这种处理方式称为左规。通过算数左移来把浮点数进行规格化,所以称为左规。

(2)右规

1.规则

既然有左规,是不是也会有对应的右规?右规是什么意思?

先来看十进制科学计数法。

当我们对科学计数法的数进行加减、乘除之类的运算之后,有可能会导致我们的尾数变成这样的形式,变成比如 302. 6 乘以 10 的 9 次方。
image.png

科学计数法会要求小数点一定是在第一个非 0 的数值位的后面,一定要写在这样的位置。
image.png

所以如果我们通过计算出的数是这样的一种表示形式,我们需要把尾数部分右移 2 位。或者换一种说法,也可以理解为是小数点左移 2 位。

为了和计算机的处理保持一致,所以我们把它理解为小数点固定不变,这些尾数右移 2 位,尾数右移两位之后,我们还需要让阶码加2,也就是从 9 变成11。

所以把尾数右移,阶码的值往上加。这种规格化的方式,我们把它称为右规

对应到二进制的浮点数也是类似的。左规的问题我们之前已经聊清楚了,右规的问题对应二进制的浮点数也是一样的。
image.png

如果我们在浮点数运算,加减乘除之类的,运算的结果在尾数部分出现了一个假溢出。如果尾数采用双符号位这样的方式来表示,我们可以通过让尾数算数右移一位,阶码加 1 的方式来实现。

类似于刚才右规的操作。

2.例子

还是来看一个右归的例子。

现在有 a 和 b 这样的两个浮点数,它们的阶码和尾数都是用补码的形式来表示的。
image.png

由于 a 和 b 它们的阶码都是2,所以它们俩的真值应该是 2 的二次方乘上各自的尾数。
image.png

现在要算 a 加b,我们可以让它们尾数进行相加,加得的结果再统一的乘以 2 的二次方

所以两个尾数相加,我们可以得到这样的一个数。
image.png

因为两个尾数的最高数值位都是1,所以 1 + 1 = 0 会往高位进一个1,这就导致双符号位里边更低的位变为了1,这种情况下说明发生了溢出。
image.png

此时双符号位里面更高的这一位表示的是正确的应该得到的正负性。 如下:
image.png

所以当我们遇到这种问题的时候,就可以通过右归的方式来把浮点数进行规格化,让尾数整体右移一位

而新空出来的位置和之前保留的正确的符号位(0)保持一致,也就是补0。
image.png

在尾数右移之后,我们还需要把阶码加1,因为阶码反映的是在尾数的基础上,小数点要后移几位,所以从这个角度去理解就能知道为什么阶码要加 1 了。

经过右归的操作之后,我们得到的尾数就是一个规格化的尾数,它的最高数值位是一个有效的值(1),此时的阶码为3,所以我们可以用 8 个比特的信息来存储 a 加 b 的值。
image.png

蓝色是阶码部分,绿色是尾数部分 0. 1010。

通过这个例子,大家应该也能够体会到为什么我们之前讲溢出那个小节的时候,会强调双符号位是最常被考察的,采用双符号位的这种方式来判断溢出。像刚才这种发生溢出的时候,我们其实是可以挽救的。

最高的符号位反映了我们本应该得到的正确的符号,所以通过更高的符号位,我们就可以把数值进行恢复。
image.png

这种溢出是可以挽救的。因此,也正是因为双符号位可以挽救某一些溢出的情况,因此采用双符号位来判断溢出的方式,也是现实当中最多被应用的。
image.png

这是浮点数的规格化问题,除了要保证尾数的最高数值位必须是一个有效值之外,在尾数经过左移或者右移之后,一定要注意阶码的值也要配套的进行减 1 或者加 1 的操作
image.png

五、规格化浮点数的特点

之前我们说过,浮点数的尾数,我们通常会使用原码或者补码来进行表示。

所以当我们采用原码或者采用补码来表示尾数的时候,尾数数值的最高位到底取多少,它才能算是一个有效值?这个问题其实是有一些区别的。

(1)原码

我们先来看最简单的原码表示的尾数。

1.正数

很简单,用原码表示的尾数,我们只需要保证最高的数值位它是 1 就可以了
image.png

这和十进制的科学计数法,我们要保证最高数值位一定不等于 0 是一个道理。

由于尾数它是定点小数,我们用原码表示,所以尾数部分所能表示的最大值就是0.11...1,最小值就是规格化尾数最小值应该是 0.10...0。因此尾数所能表示的范围就是这样的一个范围。
image.png

2.负数

接下来看负数

其实也是一样的,我们只不过是把符号位从 0 变成了 1 而已。

因为采用的是原码,所以数值部分的解释方式和正数没有什么区别,因此原码表示的负数进行规格化。同样的,我们只需要保证数值位的最高位是 1 就可以。
image.png

(2)补码

接下来看补码

1.正数

如果我们采用补码表示尾数。

首先,对于正数来说,正数的补码和原码是一样的。

我们要保证最高的数值位是一个有效位,只需要和原码一样,保证最高的数值位为 1 就可以。

所以用补码表示的尾数,正数的最大值和最小值和原码也都是一致的,所能表示的范围也一致。
image.png

2.负数

接下来不一样的来了,如果采用补码表示尾数,并且这个尾数是一个负数的时候,也就是符号位为 1 的时候。

为了让计算机处理起来方便,我们会规定数值位的最高位必须是0。只有满足这样的规定,用补码表示的尾数才是规格化为正规的尾数。如下:
image.png

所以用补码表示的尾数,如果进行了规格化之后,我们必须保证符号位还有最高的数值位是不一样的
image.png

当符号位为 0 的时候,最高的数值位必须为1;当符号位为 1 的时候,最高的数值位必须为0。

这就是一个规定,大家不需要过度的纠结为什么,因为这样的规定可以很方便地用计算机硬件来判断它是否已经规格化。

对于补码的负数来说,如果最高数值位必须为0,它所能表示的最大值就是 1. 01...1,它所能表示的最小值应该是 1. 00...0。
image.png

当我们要确定这些真值的时候,一定需要先把补码转变成原码,再来进行转换。

(3)案例

总之,想强调的是,尾数采用原码表示还是采用补码表示这个问题会影响到我们规格化的规则
image.png

来看一个简单的例子。

假设有一个浮点数,它的阶码和尾数分别是4位和8位,这已经直接给出了。
image.png

这个例子当中阶码和尾数都是用补码表示的,我们应该如何对它进行规格化?

①首先阶码部分,把它翻译一下,它对应 +6 这样的一个真值。

②再来看尾数部分。尾数部分它用补码表示的,并且是一个负数。
image.png

刚刚我们说过,负数的补码,我们必须保证它的数值位最高位一定要是0,这样我们才能保证尾数可以尽可能多地表示一些精度。

怎么进行规格化呢?很简单,只需要把尾数部分进行一个算数左移,补码负数的算数左移,直接在低位补 0 就可以。这也顺道回忆一下补码负数的算数右移,应该是高位补1。
image.png

这个地方我们要进行规格化,只需要算数左移就可以。

只需要算数左移三位,也就是让这个 0 到达小数点后面的位置,最终尾数会变成 1. 0100。低位空出来的都是补0。这样我们就完成了对尾数的规格化。
image.png

由于我们是进行了左移的规格化,每左移一次阶码应该是减 1 。所以左移了 3 位,我们就需要让阶码减3,因此阶码需要从正 6 变成正3,所以规格化之后阶码应该是0011。

(4)补充说明

刚才我们说过,尾数它的表示范围其实是有限的,阶码的表示范围也是有限的。

显然我们的浮点数,虽然它的表示范围会比同长度的定点数要大得多,但是它同样会有一个极限。
image.png

如果超出了浮点数正数所能表示的最大范围,我们把这种现象称为正上溢;如果超出了负数所能表示的最大范围,我们把它称为负上溢

而规格化之后的浮点数,它所能表示的小数,其实也会有一个下限。

结合上面推论,规格化之后的尾数,它所能表示的正数的最小值只能到 1/ 2,如果用二进制表示,就是 0. 1,最小只能表示这样的一个数。

现在如果阶码只能占三位,并且阶码用补码表示的话,那么三位的补码整数所能表示的最小的数应该是- 4 。

如果阶码只有 3 位,规格化之后的浮点数,它所能表示的最小的正数应该是在 0. 1 的基础上,小数点往前移4位也就变成 0. 00001,这就是阶码只有 3 位的时候,所能表示的最小的正数。

所以如果我们想要表示的正数比这个值还要更小,是不是就表示不了了?这种现象我们把它称为正下溢。 与正下溢相对的还有一个叫做负下溢,指我们要表示的负数绝对值已经超出了我们所能表示的最小的范围,这就是负下溢。

当我们遇到正下溢或者负下溢的情况,我们通常会把这种情况当作机器数的 0 来进行处理,因为它已经很小很小了。而如果出现之前所说的正上溢或者负上溢的情况,我们通常会抛出一个系统的异常,或者也可以说是中断,表明运算已经溢出了。

所以这就是浮点数的表示范围相关的问题,这部分的内容其实已经从 408 考试大纲里面删除了,所以我们暂且只做这些简要的了解。

六、总结回顾

image.png

这一小节当中,我们学习了浮点数在计算机里边如何表示,分为阶码和尾数这样两个部分。

阶码相当于我们在科学计数法当中乘以 10 的多少次方,而尾数相当于我们科学计数法当中前边的具体数值,尾数给出了具体数值,而阶码指明了我们的小数点需要前移或者后移多少位。

由于计算机当中小数点是固定不变的,所以我们没办法让小数点来移动,我们只能让整体的数值进行左移或者右移。

数值的左移右移和小数点的左移右移刚好是相反的,这些东西大家都可以串起来理解。

阶码通常是采用补码或者移码表示,而尾数通常采用补码或者原码表示。

这个小节我们介绍例子都是阶码、尾数都用补码表示,而下小节我们会介绍阶码、尾数用移码和原码表示的例子。

考试当中需要特别注意的是,如何从一个浮点数来确定它的真值。这部分的内容结合科学计数法并不难理解。由于尾数部分的长度有限,所以为了让尾数尽可能多的保留我们想要的精度,因此我们就提出了所谓规格化的问题。

需要特别注意的是,当我们用原码或者补码来表示尾数的时候,对于所谓规格化的尾数的定义是不一样的。原码表示的尾数,我们只需要保证最高位最高数值位是 1 就可以。而补码表示的尾数,我们需要保证尾数的最高数值位必须和尾数的符号位相反。因此在做题的时候也需要注意这样的区别。

最后我们还简单的聊了浮点数的表示范围这个问题,需要知道正上溢、负上溢还有正下溢、负下溢的意思,能有一个大概的印象就可以。

这个小节我们只是探讨了浮点数的基本思想,对于阶码尾数到底需要用多少位,各自需要用原码补码还是移码?这两个问题其实是很值得探究的,因为只有我们确定了一个标准,就是阶码尾数各自用什么码、各自取多少位。只有确定了这样的一个标准之后,不同的计算机之间才可以进行浮点数数据的交换。

下个小节我们会介绍 IEEE 754这样的标准。如果所有的计算机对于浮点数的解析都是基于这个标准,那么计算机之间对浮点数据的交换和解析就不会出现问题,都会遵循一套统一的规则。

相关文章
|
7月前
|
C语言
浮点数的表示
浮点数的表示
|
1月前
|
JavaScript 前端开发 Java
浮点数介绍
【10月更文挑战第21天】
82 1
|
3月前
|
存储 Python
整数和浮点数。
整数和浮点数。
30 7
|
4月前
|
存储
浮点数
【8月更文挑战第29天】浮点数。
75 1
浮点数中的零
Julia 提供三种浮点类型:Float16(半精度,16位),Float32(单精度,32位)和 Float64(双精度,64位)。浮点数包含正零和负零,两者相等但二进制表示不同,如 `bitstring` 函数所示:0.0 为 "000...000",而 -0.0 为 "100...000"。
浮点数的世界 0.1 + 0.2 = 0.30000000000000004?
今天看到一个有趣的新闻,浮点数计算导致的灾难,借此机会再理解一下浮点数的原理。
257 1
|
存储 Java
详解浮点数
1.什么是浮点数 在计算机系统的发展过程中,曾经提出过多种方法表示实数,但是到为止使用最广泛的是浮点表示法。浮点表示法,即用浮点数来表示实数,所谓浮点数,意思是小数点的位置不是固定的,是可以浮动的。浮点数采用IEEE 754这个标准作为统一的标准。该标准中严格定义个浮点数的表示格式、转化过程。 下面简单介绍一下IEEE 754标准。 IEEE 754的核心就是用科学计数法来表示实数,然后将表示结果转为二进制的方式,方便计算机存储。
356 0
|
编译器 C++
C++ 字符串转浮点数,包括整数、小数和科学记数法
C++ 字符串转浮点数,包括整数、小数和科学记数法
641 0
|
存储
浮点数的表示方法
浮点数的表示方法
192 0
浮点数的表示方法
06:浮点数向零舍入
06:浮点数向零舍入
220 0