IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    浮点数简介

    Shihira发表于 2015-01-02 06:38:00
    love 0

    内存中的储存形式(IEEE-745)

    Address 3        2        1        0 
    Content SEEEEEEE EBBBBBBB BBBBBBBB BBBBBBBB

    其中的字母分别代表:

    • S(Significand):1 - 正负号(-1)^S
    • E(Exponent):8 - 指数部分
    • B(Base):23 - 底数部分

    这样, 整个浮点数表示起来就是:

    (-1)^S \times 1.BBBBBBBBBBBBBBBBBBBBBBB \times 2 ^{EEEEEEEE - 01111111}

    N进制的小数

    看到10进制的小数, 小数点是用来分隔指数正负位的:

    123.456
    = 1 \times 10^2 + 2 \times 10^1 + 3 \times 10^0 + 4 \times 10^{-1} + 5 \times 10^{-2} + 6 \times 10^{-3}

    推广到N进制, 形式是完全相同的, 这里用二进制做一个例子:

    (101.0101)_2
    = 2^2 + 2^0 + 2^{-2} + 2^{-4}
    = 4+1+{1 \over 4}+{1 \over 16}
    = 5.3125

    构造一个浮点数

    以12.625为例子. 首先我们推算一下它的二进制形式是什么. 如我们所知, 整数部分和小数部分的位置是恒定不变的, 因为它们是否小于1这个性质, 无论在什么进制之下都不会改变. 首先算整数部分:

    12 \div 2 = 6 \cdots 0
    6 \div 2 = 3 \cdots 0
    3 \div 2 = 1 \cdots 1
    1 \div 2 = 0 \cdots 1
    \therefore \ (12)_10 = (1100)_2

    小数部分(不知道是否注意到, 小数部分只有是2^n的和才有可能被表示成不循环小数. 诸如0.7, 0.3都是二进制的无限循环小数):

    0.625 \times 2 = 1 + 0.25
    0.25 \times 2 = 0 + 0.5
    0.5 \times 2 = 1
    \therefore \ (0.625)_{10} = (0.101)_2

    这样, 我们得到了一个二进位的小数1100.101, 并且化成IEEE-745标准形式:

    1100.101 = 1.100101 \times 2^{00000011 + 01111111 - 01111111}

    Address 3        2        1        0 
    Content SEEEEEEE EBBBBBBB BBBBBBBB BBBBBBBB
    Value 01000001 01001010 00000000 00000000
    Hex 41 4A 00 00

    现在我们得到了一个整数0x414A0000, 把它输出出来看看是多少:

    $ cat test.c 
    #include
    int main()
    {
    union {
    unsigned long u;
    float f;
    } u;
    u.u = 0x414a0000;
    printf("%f\n", u.f);
    return 0;
    }

    $ ./test
    12.625000
    ​


    Shihira 2015-01-02 14:38 发表评论


沪ICP备19023445号-2号
友情链接