如何将二进制浮点数转换为十进制小数?

4
我在一份作业中遇到了困难,需要将二进制浮点数转换为小数。我觉得我理解了这个过程,但是我没有得到正确的答案。以下是我的思路。
我有一个二进制浮点数:0 000 101
  • 3位指数字段的偏置为3:2^(3-1)-1 = 3
  • 尾数变为1.101(基数为2)
  • 指数位的值为0,减去指数位数3,为-3,所以尾数的十进制小数点向左移动3位
    0.001101
  • 在10进制中,它是2^-3 + 2^-4 + 2^-6,等于0.203125或13/64。
然而,13/64不是正确的答案,自动评分程序也无法接受它。如果我的答案是错误的,那么我不明白为什么,希望有人能指导我正确的方向。
出于纯粹的运气,我猜测5/32是正确的答案,并且我得到了正确的结果;我不知道为什么会这样。

1
纯属运气,我猜测5/32是答案,结果正确了;我不知道为什么会这样。 - Grav
2
也许这个格式没有隐藏的前导1位?那么尾数就是1.01,值为1.01 x 2^-3,即5/32。 - prl
你的作业任务是否告诉你这是IEEE754格式?我不知道是否还有其他使用偏置指数但对非规格化数具有不同含义的格式。(你的问题已经清楚地表明你正在使用IEEE754的偏置指数,因此它不能是完全不同的格式。有趣的事实是,C语言并不要求FP类型完全使用IEEE格式。但是你标记了[assembly],所以我猜这是为了教学ISA而使用7位IEEE风格的浮点数?这很奇怪,为什么不用8位IEEE https://en.wikipedia.org/wiki/Minifloat?) - Peter Cordes
1
我们有两个不同的作业,一个是针对7位浮点数,另一个是8位的。我想先从7位开始。作业没有提到任何关于不同格式的内容;我对这些东西还很陌生,但我知道在本学期后期我们将会编写ARM64指令,不知道那是否更有意义。 - Grav
@Grav:是的,学8位和7位浮点数格式是有意义的。听起来是个不错的方法。但希望你们班学到了关于浮点数格式中包括denormals的知识!否则这就是一个真正的坑人作业:P 但是是的,ARM64使用IEEE754浮点数,就像你在这里学到的一样。有趣的是,ARM NEON(simd矢量化浮点数)不支持denormals: 它将它们刷新为零。 (https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html)。 显然,ARM64确实支持IEEE fp16格式:https://gcc.gnu.org/onlinedocs/gcc/Half-Precision.html - Peter Cordes
显示剩余4条评论
1个回答

4
在IEEE-754浮点格式中,指数=0是非规格化数,其中尾数中的隐含前导位为0
维基百科有一篇关于单精度float(binary32)格式的详细文章,其中包含大量示例。对于binary32 float,公式为(来自维基文章):
(−1)^signbit × 2^(−126)        × 0.significandbits   ; denormal, expbits=0
(−1)^signbit × 2^(expbits−127) × 1.significandbits   ; normal
 Inf  or  NaN (depending on mantissa aka significant); expbits = all 1s

(请注意,0.0是denormal的一种特殊情况,但实际上并不被视为denormal。)
(无论如何,当指数为零时,请注意指数不再是expbits - bias,而是高一位。)

回到你的情况:你的尾数是0.101二进制,0.625十进制(我在计算器中输入了0b101 / 8)。

2^-2 * 0.101(二进制)= 2^-2 * 0.625(十进制)= 0.15625 = 5/32


这里有一篇维基百科文章,它提到了一个8位IEEE格式以及其他在电脑图形硬件中使用的小于32位的格式(例如24位或16位),并给出了相应的示例。有趣的是,x86可以加载/存储16位半精度浮点数向量,并通过F16C ISA扩展在寄存器中转换成/从单精度浮点数。

此外,还有一个在线转换器,其中包括勾选框以显示每个位:https://www.h-schmidt.net/FloatConverter/IEEE754.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接