浮点数如何存储在CPU内?

时间:2017-07-13 06:40:54

标签: assembly floating-point ieee-754

我是初学者并经历了大会基础知识。在阅读此事时,我来到了这一段。它解释了浮点数如何存储在内存中。

  

float的指数是8位字段。允许大数或   要存储的小数字,指数被解释为正数或   负。实际指数是8位字段的值减去127。   127是32位浮点数的“指数偏差”。   浮子的分数字段有一个小小的惊喜。由于定义了0.0   因为所有位都设置为0,所以无需担心将0.0表示为   指数字段等于127,分数字段设置为所有O.所有其他   数字至少有1位,因此IEEE 754格式使用隐式1   有点节省空间。因此,如果分数字段是00000000000000000000000,那么   被解释为1。 00000000000000000000000.这允许分数   字段有效24位。这是一个聪明的伎俩   使OxOO和OxFF的指数字段特殊。

我根本没有得到它。

你能解释一下它们是如何存储在内存中的吗?我不需要参考,我只需要一个很好的解释,这样我就可以轻松理解。

2 个答案:

答案 0 :(得分:4)

浮点数遵循IEEE754标准。他们一直在使用这组规则,主要是因为浮点数可以(相对)容易地与整数和其他浮点数进行比较。

有两个版本的浮点:32位和64位。但它们之间的唯一区别是它们的字段大小:

  • 指数:32位为8位,64位为11位
  • 尾数:32位为23位,64位为52位

还有一个位,即符号位,用于指定所考虑的数字是正数还是负数。

现在,举个例子12,375 base 10(32bit):

  • 第一步是在基数2中转换此数字: 这很简单,经过一些计算后你会得到:1100.011

  • 接下来,您必须移动“逗号”,直至获得1.100011(直到.之前的唯一数字为1)。我们移动逗号的次数是多少? 3,即指数。这意味着我们的号码可以表示为1.100011*2^3

  • 之后我们必须“规范化”指数,所以我们添加偏差,即32位浮点数为127。我们为什么要这样做?答案是:因为通过这种方式我们可以更容易地将浮点数与整数进行比较。如果我们不这样做,则使用双补码表示法表示负指数,基本上将1放在最重要的位中。但是通过这种方式,较小的浮点似乎大于正指数浮点。出于这个原因:我们只添加127,这个小“技巧”​​所有正指数都从10000000基数2(1个基数10)开始,而负指数最多达到01111110基数2(这是-1 base 10)。

在我们的示例中,归一化指数为10000010 base 2。

  • 最后要做的是在指数后添加mantix(.100011),结果为:

    01000001010001100000000000000000
     |  exp ||      mantix         |
    

(第一位是符号位)

答案 1 :(得分:1)

与小学数学没什么不同。我们在小学里学到了先做正整数加,减去所有这些。然后我们学会了制作一个代表减号的水平划痕,并指出负数并了解数字线,我们不能去netagive。因此,否定符号的存在(或负号与加号)表示个别数字是正数还是负数。它只需要一位二进制来表示我是消极的或积极的。这是"标志"位于/此浮点格式(或任何其他)。

然后在小学的某个时刻,我们在做了一段时间的分数之后我们学会了小数点。那只是我们在两个数字之间放置的一段时间,它表示最后一个数字的位置和分数开始的位置。我可以在那里停下来说没有任何理由让基地2与基地10不同,从基地13到基地27你只需要在两个数字之间放一个句点来表示最后一个整数的位置和分数的第一部分。但浮动点更进一步。现在这可能是在小学或以后的中学,但他们最终教我们科学记数法和/或通过移动小数点来表示数字的其他方法,小数的种类仍代表最后一个整数和分数的开始但是偏离一边我们将基数乘以幂

12345.67 = 1.234567 * 10^4

这就是这个难题的剩余部分。使用铅笔和纸,只要我们有足够的纸张和足够的铅笔芯(石墨),我们就可以用尽可能多的数字来编写数字,但正如您已经知道的那样,我们通常会受到寄存器大小的限制,现在我们可以使用其他小学的知识将8位alu转换为无限数量的alu(只要我们有足够的内存/存储位),但在这种情况下我们仍然处理8位。在这种情况下,他们选择最初的32位,64位和80位(或者可能是后来的)格式,所以我们的位严格限制这些数字(我们现在有16位,可能更小虽然没有多大意义),并且它们使用时间基于幂指数。东西是上面的1.234567的尾数但是没有小数点存储1234567小数点的位置被假定/同意(已知)。它是数字中的第一个非零数字,所以123456.7我们将它移动到1.234567并将指数调整为78.45我们将它移动到7.845并调整基数乘数上的指数。因为这是二进制的,所以只有一个值不为零且是一个(一个位是0或1)所以011101.000我们将它移动到1.110100并调整指数。 (这就像科学记谱法,但基础2)

接下来,这个尾数中的位数或科学记数法中的有效数字如果你想以这种方式将其限制在23或者某些位数内,请参阅单精度浮点格式的维基百科页面( 32位一,双精度是64位,并且工作方式完全相同,只是有更多的尾数和指数位)。所以我们得到我们的数字然而我们找到最重要的数字,我们在那里移动小数点并调整乘数上的指数就像我们上面那样

11101.01 = 1.110101 * 2^4

我们技术上不需要在小数点之前存储1并且我们不需要存储2但是我们需要存储110101并且我们需要以二进制形式存储4。随着上述情况中的符号表示正数,所以符号,指数和尾数我们可以重建这个数字。或者任何符合那些不是很小或非常大的数字(这样的指数就不适合分配的位数)。

然后,IEEE-754人员采取了最后一步,而不仅仅是编码指数,他们使用了一种向后的二进制补码。我们已经从计算机上的整数数学知道了两个补码以及如何理解这些数字的样子。由于某种原因,他们没有做到这一点,它会更有意义,但他们宣称1000 ... 0000一个二进制的全零是中点的定义或另一种看待它的方式是全部零是最小的指数,所有的都是最大的指数,你必须调整它。我们知道在这种情况下,从8位数字的二进制补码中,最大数字是+127,最小的-128,他们所做的是改变这个,所以他们可以有更大的正指数,而不是+127到-128,如同二进制补码这是向后它是+128到-127,对我们来说它只是意味着我们通过添加127进行调整。在我的上述情况下,2到4的功率4的二进制是100使用8位二进制补码00000100到&# 34;编码"它成为单精度IEEE 754浮点格式,变为10000011我只需添加127或添加128(10000100)然后减去一个。

所以我撒谎还有一些事情,特殊情况,到目前为止,我们有一位用于符号是正面还是负面,8位用于2乘法器的幂的编码指数,我们有尾数或分数我们号码中有效数字的位数。但是零如何在零中没有非零位我们如何表示这个数字呢?那么这是一个特殊的情况,几乎是硬编码的数字,但你实际上可以在格式中表示具有不同位模式的+0和-0,但是我认为鼓励或规定导致零的数学的后续版本是积极的,但是我不知道我肯定多年没有看到规范的副本,因为你必须付钱才能合法地获得它。其他特殊情况称为NaN或不是数字,它们也是已知代表NaN的特殊位模式......并且有多个nan,因为您可以在尾数中放置不同的模式。例如,当你除以零时,或者当你的数字太大而你无法用幂数N表示它时,这是因为N对于指数中编码的位数来说太大了(更大)比单精度编码前的+128或数字太小(指数小于-127)。虽然在某些格式中有些数字称为微小数字或非正规数,而那些数字不是1.xxxx,但它们会让它滑落并且具有0.000 ... 1xxxx,这是一种无效的格式,但只是比我们的最小数字小一点可以表示,某些fpus /软件不支持非正规。

现在转到维基百科并搜索单精度浮点格式,现在该页面应该有很多意义......我希望......