JavaRush /Java 博客 /Random-ZH /浮点数里面有什么以及它是如何工作的?
Ivan
第 2 级
Харьков

浮点数里面有什么以及它是如何工作的?

已在 Random-ZH 群组中发布

内容:

图片:http://pikabu.ru/

介绍

在学习 Java 的最初几天,我遇到了浮点数这样一种奇怪的原语类型。我立即对它们的功能感兴趣,更感兴趣的是它们用二进制代码(互连的)编写的方式。与任何整数范围不同,即使在非常小的范围内(例如,从 1 到 2),它们的数量也是无限的。而且内存大小有限,不可能表达这个集合。那么它们是如何用二进制表示的以及它们是如何工作的呢?唉,维基上的解释和一篇关于哈布雷的相当酷的文章没有让我完全理解,尽管它们奠定了基础。直到第二天早上读完 这篇分析文章后,我才意识到这一点。

历史之旅

摘自Habré的这篇文章)在60-70年代,当计算机很大而程序很小时,仍然没有单一的计算标准,也没有一个表达浮点数本身的标准。每台计算机的处理方式都不同,并且都有自己的错误。但在 70 年代中期,英特尔决定制造支持“改进”算法的新处理器,同时对其进行标准化。威廉·卡汉(William Kahan)和约翰·帕尔默(John Palmer)教授(不,不是有关啤酒的书籍的作者)被聘请来开发它。虽然发生了一些戏剧性的事情,但制定了新的标准。现在这个标准被称为IEEE754

浮点数格式

即使在学校教科书中,每个人都面临着以 1.2 × 10 31.2 E3形式书写非常大或非常小的数字的不寻常方式,这等于1.2 × 1000 = 1200。这称为指数记数法。在这种情况下,我们使用以下公式处理数字的表达式: N=M×n p,其中
  • N = 1200 - 结果数字
  • M = 1,2 - 尾数 - 小数部分,不考虑阶次
  • n = 10是顺序的基数。在这种情况下,当我们不谈论计算机时,基数是数字 10
  • p = 3 - 碱度
通常,阶数的基数被假定为10 ,并且仅写入尾数和基数的值,并用字母E分隔它们。在我们的示例中,我给出了等效条目1.2 × 10 31.2 E3 如果一切都清楚了,并且我们已经完成了学校课程的怀旧之旅,那么现在我建议忘记这一点,因为在形成浮点数时,我们正在处理二的幂,而不是十的幂,即 n = 2,整个和谐公式1.2E3崩溃了,真是伤透了我的脑子。

标志和学位

那么我们有什么呢?因此,我们还有一个二进制数,它由尾数组成- 我们将求幂的部分和幂本身。此外,正如整数类型常见的那样,浮点数有一个位来确定符号 - 数字是正数还是负数。作为示例,我建议考虑float由 32 位组成的 type 。对于双精度数,double逻辑是相同的,只是位数是双精度数的两倍。在 32 位中,第一个最高有效位分配给符号,接下来的 8 位分配给指数(尾数的幂),剩下的 23 位分配给尾数。为了进行演示,让我们看一个例子: 浮点数的内部结构及其工作原理 - 1第一点非常简单。如果第一位的值为0,那么我们得到的数字将为正数。如果该位为1,则该数将为负数。下一个 8 位块是指数块。指数被写成一个常规的八位数字,为了获得所需的次数,我们需要从结果数中减去127 。在我们的例子中,指数的八位是10000001。这对应于数字129。如果您对如何计算有疑问,那么图片会显示一个快速答案。任何布尔代数课程都可以获得扩展版本。 浮点数的内部结构及其工作原理 - 21×2 7 + 0×2 6 + 0×2 5 + 0×2 4 + 0×2 3 + 0×2 2 + 0×2 1 + 1×2 0 = 1×128 + 1×1 = 128+ 1=129 不难算出,这8位我们能得到的最大数是 11111111 2 = 255 10(下标210表示二进制和十进制)但是,如果我们只使用正指数值(从0到255),那么得到的数字将有很多小数点之前的数字,但小数点之后没有?要获得次数的负值,需要从生成的指数中减去127。因此,度数范围为-127 到 128。使用我们的示例,所需的度数将为129-127 = 2。现在让我们记住这个数字。

尾数

现在关于尾数。它由 23 位组成,但在开始时总是隐含另一个单元,而未为其分配位。这样做是出于方便和经济的原因。相同的数可以通过在小数点之前或之后的尾数加零来表示为不同的幂。理解这一点的最简单方法是使用十进制指数: 120,000 = 1.2×10 5 = 0.12×10 6 = 0.012×10 7 = 0.0012×10 8等。然而,通过在尾数开头输入固定数字,我们每次都会收到新的数字。我们理所当然地认为,在我们的 23 位之前,还会有 1 位加 1。通常,该位与其余部分用点分隔,但这并不意味着任何内容。就是比较方便1. 111000000000000000000000 浮点数的内部结构及其工作原理 - 3现在需要从左到右对所得尾数求幂,每一步将幂减一。我们从计算得到的幂的值开始,即2 (我故意选择了一个简单的例子,以免把2的幂的每个值都写出来,也没有在上表中计算)对应位为零) 浮点数的内部结构及其工作原理 - 41×2 2 + 1×2 1 + 1×2 0 + 1×2 -1 = 1×4 + 1×2 + 1×1 + 1×0.5 = 4+2+1+0.5 = 7.5 并得到结果7.5,可以检查正确性,例如在此链接

结果

标准浮点数float由 32 位组成,第一位是符号(+ 或 -),接下来的 8 位是指数,接下来的 23 位是尾数 按符号 - 如果位 0 是正数。如果位 1 为负。 通过指数- 我们按位转换为十进制数(左起第一位是128,第二位是64,第三位是32,第四位是16,第五位是8,第六位是4,第七位是2,第八个是1 ),从结果数中减去127,我们就得到了开始的度数。 根据尾数- 在前面现有的 23 位中,我们添加另一个值为 1 的位,并从它开始提高我们收到的幂,并随着每个后续位递减该幂。 这就是大家,孩子们! 浮点数的内部结构及其工作原理 - 5PS:作为家庭作业,请使用本文,在评论中留下你的版本,说明为什么大量浮点数算术运算会出现精度错误
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION