我有一些疑问,试图更好地理解浮点数是如何在内部表示的,也许你可以帮助我。所以,我主要研究IEEE754规范,它说浮点数应该有:
1 bit for significand's sign
8 bits for exponent
23 bits for significand precision
(I'm taking the Single-precision format here)
正如你所看到的,它说1位是专门为有效符号保留的,所以它让我认为有效符号实际上是使用符号和大小表示来表示的,对吗?(说真的,我在网上找不到这种信息)如果答案是肯定的,那么为什么选择符号和大小表示而不是二补码?如果答案是否定的,那么为什么为符号保留1位?
关于指数,我对它的表示也有一些疑问。我在书/维基上读到指数是一个带有偏差编码的无符号数。然而,显然指数必须同时代表正数和负数,所以我的问题是:指数可以根据应用程序进行不同的解释?例如,如果我需要将我的指数用作双补数,如果它是一个无符号数,我该如何做?
非常感谢!我有点迷茫,所以如果你能给我一个完整的解释,我会非常感激!
您通常应该避免直接操作IEEE二进制浮点数的内部。您的编程语言和库通常会处理转换和格式化输出。大多数计算机都有硬件算术。
我只针对你的具体问题给出一个大纲。维基百科有一篇文章,单精度浮点格式,很好地涵盖了这个主题,带有图表和示例。
数字确实以符号和大小的形式存储。
对于普通数字,实际有效数的最高有效位数必须是1,因此不存储。
指数存储为实际指数和偏差127的总和,以确保非负位模式。该系统的好处是浮点数之间的比较更简单。两个极端指数位模式,0和所有位,都经过特殊处理。
>
是的,它是符号和大小表示。但是,在内部,您的处理器可能会在2的补码表示中编码尾数。例如:
--对于减法,其中一个尾数必须以-ve编码,实际上处理器选择指数值最低的那个,因此对尾数部分进行2的补码减法。
-对于加法和乘法,不需要内部2的补码,但实际上尾数加法是正2的补码表示。
如果您使用的是std,任何x86机器。不,指数总是以这种方式表示无符号表示-(2^(n-1)-1)
其中n
是指数部分的宽度。对于单精度,n=8
因此偏置2^(n-1)-1=127
,您只需要执行此操作并将其存储在带符号的变量中,例如int
in c, c.
为了理解指数部分,我们以单精度为例:
--00000000,表示代数和零表示。
--00000001,表示可能的最低指数,即1-127=-126
--00000010,表示下一个指数=-125,依此类推。
.....
--11111110,表示最大可能指数=254-127=127
--11111111,表示溢出和NaN。