首页 文章

浮点数如何存储在CPU内?

提问于
浏览
3

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

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

我根本没有得到它 .

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

2 回答

  • 1

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

    然后在小学的某些时候,我们在做了一段时间的分数之后学会了小数点 . 那只是我们在两个数字之间放置的一个时期,它表示最后一个数字的位置和分数开始的位置 . 我可以在那里停下来说没有任何理由让基地2与基地10从基地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将其“编码”成单精度IEEE 754浮点格式变为10000011我只需添加127或添加128(10000100)然后减去一个 .

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

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

  • 4

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

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

    • 指数:32位为8位,64位为11位

    • 尾数:32位为23位,64位为52位

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

    现在,以 12,375 base 10(32bit)为例:

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

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

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

    在我们的例子中,归一化指数是 10000010 base 2 .

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

    (第一位是符号位)

相关问题