【问题标题】:How do I convert from a decimal number to IEEE 754 single-precision floating-point format?如何从十进制数转换为 IEEE 754 单精度浮点格式?
【发布时间】:2011-01-25 04:04:10
【问题描述】:

如何手动将十进制(以 10 为基数)数字更改为 IEEE 754 单精度浮点格式?我知道它由三个部分组成,一个符号,一个指数和一个尾数。我只是不完全理解最后两部分实际代表什么。

【问题讨论】:

标签: binary floating-point ieee-754


【解决方案1】:

找到小于你的数字的 2 的最大幂,例如,如果你从 x = 10.0 开始,那么 23 = 8,所以指数是 3。指数有 127 的偏差,所以这意味着指数将表示为 127 + 3 = 130。尾数为 10.0/8 = 1.25。 1 是隐含的,因此我们只需要表示 0.25,即 010 0000 0000 0000 0000 0000 表示为 23 位无符号小数。符号位为 0 表示正数。所以我们有:

s | exp [130]  | mantissa [(1).25]            |

0 | 100 0001 0 | 010 0000 0000 0000 0000 0000 |

0x41200000

您可以使用简单的 C 程序来测试表示,例如

#include <stdio.h>

typedef union
{
    int i;
    float f;
} U;

int main(void)
{
    U u;
    
    u.f = 10.0;
    
    printf("%g = %#x\n", u.f, u.i);

    return 0;
}

【讨论】:

  • 您能创建一个 MATLAB 脚本吗?谢谢。
  • @Drazick:如果您有 MATLAB 问题,请将其作为新问题发布。
  • 嗨,'c' 代码也会很棒。只是想要一个参考代码来实现您的解决方案。谢谢。
  • @Drazick:上面的答案中有 C 代码 - 或者你需要不同的东西吗?
  • @Royi:strtod 的一般情况对于使计算机正确高效地运行非常重要。它可能需要扩展精度整数来处理比 uint64_t 更宽的整数或小数部分。在某些情况下,实际代码要么是错误的,要么太复杂而无法真正帮助理解基本步骤。见exploringbinary.com/…/exploringbinary.com/how-strtod-works-and-sometimes-doesnt/exploringbinary.com/how-glibc-strtod-works
【解决方案2】:

浮点数就是scientific notation。假设我让你用科学记数法表达circumference of the Earth in meters。你会写:

4.007516×107m

指数就是:这里是十的幂。尾数是数字的实际数字。当然,符号只是正面或负面的。所以在这种情况下,指数是 7,尾数是 4.007516。

IEEE754 和小学科学记数法之间的唯一显着区别是浮点数以 2 为底,所以它不是某物的 10 次方,而是 2 次方某物。所以你可以用普通的人类科学记数法将 256 写成:

2.56×102(尾数 2.56 和指数 2),

在 IEEE754 中是

1×28 — 尾数为 1,指数为 8。

【讨论】:

    【解决方案3】:

    取一个数字 172.625。这个数字是 Base10 格式。

    将此格式转换为base2格式 为此,首先将 172 转换为二进制格式

    128 64 32 16 8 4 2 1
     1  0  1  0  1 1 0 0
    172=10101100
    

    将 0.625 转换为二进制格式

    0.625*2=1.250   1
    0.250*2=.50     0
    0.50*2=1.0      1
    0.625=101
    

    二进制格式 172.625=10101100.101。这是base2格式10101100*2

    移动这个二进制数

    1.0101100*2 **7      Normalized
    1.0101100 is mantissa
    2 **7 is exponent
    

    添加指数 127 7+127=134

    将134转换成二进制格式

    134=10000110
    

    这个数字是正数所以数字0的符号

    0 |10000110 |01011001010000000000000
    

    说明: 位的高位是数字的符号。 number 以符号大小格式存储。 指数以 8 位字段格式存储,与指数相差 127 以 23 位低位存储的二进制小数点右侧的数字。 注意---此格式为 IEEE 32 位浮点格式

    【讨论】:

    • 你的IEEE FP格式的尾数不应该是01011000000000000000000吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 2011-09-18
    • 2013-12-16
    • 1970-01-01
    相关资源
    最近更新 更多