如何区分1和零浮点值?

时间:2011-01-28 10:29:45

标签: assembly floating-point format

我知道这可能是一个noob问题,但由于我正在研究的电子书中没有涉及我会问它。在IEEE标准二进制浮点格式中,实际上用科学记数法表示数字我知道一个整数值总是假设被添加到二进制的有效部分所示的小数部分并且不包含在二进制中,那么什么混淆我是如何区分1和零浮点值,因为我假设两者都有一个完全零的有效数,我想这里的区分应该由指数部分完成,但不知道如何!

2 个答案:

答案 0 :(得分:6)

对于零(有两个,正零和负零在符号位上有所不同但必须被认为是相等的),有效数指数都是0位,而对于非零值中至少有一个具有1位(对于值1,指数除了最重要的值之外都是1位)。

Wikipedia article on the IEEE 754 standard列出了确切的位模式。

答案 1 :(得分:1)

我写了一个答案,提到(除其他外)隐含位(这是我假设你想知道的)这里https://stackoverflow.com/questions/327020/why-are-floating-point-values-so-prolific/4164252#4164252

我会在这里进一步扩展它。我将使用字符序列“< =>”和“=>”表示“等同于”和“给予”。

如果你看一下32位无符号整数格式的iEEE-754单精度浮点数(SPFP),这就是如何提取各个部分:

  • 签名:与0x80000000(1位)和右移31位
  • 指数:AND与0x7f800000(8 位)和右移23个地方
  • 有效(尾数):和 0x007fffff(23位)。如果是原件 浮点数是非零的 或者在“隐含”位中 0x00800000(=有效数据中的> 24位)。

零有两种变体:0.0和-0.0(0x00000000和0x80000000)。指数= 0且有效数= 0定义零。以同样的方式,还有两个变体:1.0和-1.0(0x3f800000和0xbf800000)。正如你所看到的,没有令人困惑的0.0和1.0。我会试着解释原因。

任何非零数字都将具有0x01到0xfe范围内的指数。有些过度简化的指数0x00具有非零有效数用于下溢结果情况,指数0xff具有非零有效数用于溢出结果情况(即SPFP异常)。对应于1.0的指数是0x7f,其对应于0(参见下一段),其给出2 ^ 0 = 1.下面的下一个指数是0x7e并且对应于-1,其给出2 ^ -1 = 0.5,依此类推。对于指数0x7f,有效数将尝试表示范围为1.0< = x<的所有数字。 2.0,也就是说,指数定义了你想要表示的数字的下限,它可以达到但不包括下一个更高的2的指数。

如果您发现指数难以理解并希望它显得“更正常”(作为基数10人),您可以从中减去0x7f(127),您将获得-126到127的范围。-128将是溢出指数,-127是下溢。

这样你就不会想到我已经忘记了:如果你设置了符号位,则指数0x7f将尝试表示-1.0> = x>范围内的所有数字。 -2.0

现在到了隐含位。隐含位可以称为位“22.5”,因为它位于有效数的最高显式位和指数的最低显式位之间。它的含义是指数位置为1。因此,对于指数0x7f(< => 0 => 2 ^ 0),它意味着1.0是所表示的实数的分量。它右边的第一个显式位(尾数的第22位)表示对应于下一个较小指数(07f-0x01 = 0x7e< => -1 => 2 ^ -1)或0.5的数字是否为实数的一个组成部分等等。因此,指数为0x7f的单精度浮点值的最小分量为0x7f-23(有效位中的位)= 0x68(< => -23 => 2 ^ -23)。

将它们全部放在一起:对应于SPFP值0x42b80000的实数是指数0x85-0x7f = 6 =>隐含位为64.0:

  • 2 ^ 6 * 1(隐含位始终为1)+
  • 2 ^ 5 * 0(有效数字的第22位是 重置)+
  • 2 ^ 4 * 1(设置第21位)+
  • 2 ^ 3 * 1(设置位20)+
  • 2 ^ 2 * 1(设置第19位)+
  • (位18到0被重置并且它们的 相应的组件(2 ^ 1到 因此不使用2 ^ -17)

2 ^ 6 + 2 ^ 4 + 2 ^ 3 + 2 ^ 2 => 64 + 16 + 8 + 4 => 92.0,这是0x42b80000所代表的实数。

在这个例子中,您可以看到如何/有效值被左调整,这允许SPFP格式的隐含位22.5成为有效数字的显式位23(尽管总是设置),从而增加了额外的精度位SPFP格式。 DPFP(双精度)格式类似,但指数范围更大,有效数更长。

我建议您对格式进行一些实验。我个人的猜测是99%的程序员都没有。