如何在内部表示浮点数的有效位数和指数?

时间:2014-08-20 22:37:55

标签: floating-point

我有点怀疑试图更好地了解内部如何表示浮点数,也许你可以帮助我。所以,我主要研究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-and-magnitude 代表性,是正确的? (严重的是,我在互联网上找到这种信息时遇到了问题)如果答案是肯定的,那么为什么选择符号和幅度表示而不是双补?如果答案为否,那么为什么1位被保留用于符号

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

对于正常数字,实际有效数字的最高有效位必须为1,因此不会存储。

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

答案 1 :(得分:0)

  1. 是的,它是符号和数字表示。但是,您的处理器内部可能会以2的补码表示形式编码尾数。例如:

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

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

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

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

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

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

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

     .....
    

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

    - 11111111,表示溢出和NaN。