【问题标题】:How the significand and the exponent of a floating point number are represented internally?浮点数的有效位和指数如何在内部表示?
【发布时间】:2014-10-14 10:53:18
【问题描述】:

我有一些疑问,试图更好地理解浮点数在内部是如何表示的,也许你可以帮助我。所以,我主要研究 IEEE 754 规范,它说浮点数应该有:

1 bit for significand's sign
8 bits for exponent
23 bits for significand precision
(I'm taking the Single-precision format here)

正如你所看到的,它说 1 位是专门为有效数字 sign 保留的,所以它让我认为有效数字实际上是使用 sign-and-magnitude 表示的strong> 表示,是否正确? (说真的,我很难在互联网上找到此类信息)如果答案是肯定的,那么为什么选择符号和大小表示而不是二补码?如果答案是否定的,那么为什么要为符号保留 1 位

关于指数,我对它的表示也有一些疑问。我在 book/wiki 中读到,指数是一个带有偏差的无符号数。但是,显然指数必须同时表示正数和负数,所以我的问题是:根据应用程序可以对指数进行不同的解释?例如,如果我需要将指数用作双 -补数,如果是无符号数怎么办?

非常感谢!我有点迷茫,所以如果你能给我一个完整的解释,我将不胜感激!

【问题讨论】:

  • 很少需要实际查看浮点数的内部结构。您可以使用它们,只依靠经过良好测试的软件来进行转换,并依靠硬件来对它们进行算术运算。有关如何处理指数的说明,请参阅Exponent Encoding,并附有示例。

标签: floating-point


【解决方案1】:
  1. 是的,它是符号和大小表示。但是,在内部,您的处理器可能会将尾数编码为 2 的补码表示。例如:

    --对于减法,尾数之一必须编码在-ve中,实际上处理器选择具有最低指数值的那个,因此完成尾数部分的2的补码减法。

    -- 对于加法和乘法,不需要内部 2 的补码,但实际上除此之外的尾数是正 2 的补码表示。

  2. 如果您使用的是 std,则可以是任何 x86 机器。不,指数总是以unsigned representation - (2^(n-1)-1) 的方式表示,其中n 是指数部分的宽度。对于单精度,n=8 因此偏差2^(n-1)-1=127,您只需要执行此操作并将其存储在有符号变量中,例如int 在 c、c++ 中。

为了理解指数部分,我们以单精度为例:

-- 00000000,代表非正规和零表示。

-- 00000001,表示可能的最低指数,即1 - 127 = -126

-- 00000010,表示下一个指数 = -125,以此类推。

 .....

-- 11111110,表示最大可能指数 = 254-127=127

-- 11111111,代表溢出和NaN。

【讨论】:

    【解决方案2】:

    您通常应该避免直接操作 IEEE 二进制浮点数的内部结构。您的编程语言和库通常会处理转换和格式化输出。大多数计算机都有硬件算法。

    我只会针对您的具体问题给出一个大纲。维基百科有一篇文章Single-precision floating-point format,很好地涵盖了这个主题,并附有图表和示例。

    数字确实以符号和大小的形式存储。

    对于普通数,实际有效位的最高有效位必须为 1,因此不存储。

    指数存储为实际指数和偏差 127 的总和,以确保非负位模式。该系统的好处是浮点数之间的比较更简单。两个极端指数位模式,0 和所有位都被特殊处理。

    【讨论】:

      猜你喜欢
      • 2020-10-16
      • 2019-04-16
      • 1970-01-01
      • 2018-02-16
      • 2012-09-30
      • 1970-01-01
      • 2011-02-04
      • 2011-09-03
      • 2021-09-30
      相关资源
      最近更新 更多