• IEEE 754 理解记录


    IEEE 754 是最广泛使用的 二进制浮点数算术标准。

    组成

    浮点法表示一个数分为三个部分:符号位 + 指数 + 尾数;通常我们是用二进制的科学计数法表示出来,如 5(101) 记成 1.01 * 2^2。我们可以称 01 为尾数,2为指数。

    • 符号位 sign

      符号位只占一位,0表示正数,1表示负数

    • 指数 exponent

      通常又称为阶码,后续描述中为了与科学计数法的指数进行区分,我们都称e位二进制的指数部分为“阶码”。

      阶码有 e 位,这里并不是直接用的科学计数法表示出来的指数;而是做了偏移处理,实际存储的指数要偏移 2^(e-1)-1。

      为什么要偏移呢?因为0次方是存在的,但阶码的0却要用于表示特殊的数(零或非规格数),因此需要找其他的数代替0。

      以单精度的举例,阶码有8位,就要偏移 127,看一个对应图就明白了。

      image-20211020213514726

      可以看到单精度可表示的指数范围为 -126 ~ 127。

    • 尾数 fraction

      即表示为科学计数法后的小数部分,如上面的5,尾数部分则是 01。因为二进制中第一个有效数字必定是1,因此可以节约1bit。

    IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43比特以上,很少使用)与延伸双精确度(79比特以上,通常以80位实现)。其中单精度指数域有 8 个bit,尾数有 23 个bit;双精度指数域为 11 bit,尾数为 52 bit。

    意义

    符号位 阶码 尾数 意义
    0/1 0 0 ±零
    0/1 0 非0 非规格化数
    0/1 1 ~ 2^e-2 任意 规格化数
    0/1 2^e - 1(全1) 0 ±无穷
    0/1 2^e - 1(全1) 非零 非数值 NaN

    1、零

    浮点数的0还区分正负,不过一般似乎没有什么区别。只是在除法时有点区别:

    double x = 0.0;
    double y = -0.0;
    1/x == INF; 1/y == -INF;
    

    2、规格化数

    规格化的意思是采用科学计数法的规范表示的数。

    如单精度的规格化数范围为:

    [±(1.xx···xx × 2^{-126} , 1.xx···xx × 2^{127}) ]

    其中x为0或1。

    3、非规格化数

    非规格化可以用于表示比规格化数还接近0的数。如单精度规格化数无法表示 1.01e-128,因为最小的指数为-126,非规格化可以将尾数规则放开。

    4、无穷

    INF表示无穷,出现无穷的常见情况有:

    • 无穷与自身运算, 如负无穷+2依然是负无穷
    • 被0除, 例如1/0得到正无穷
    • 上溢, 即计算结果超出类型范围

    5、非数值

    即一些运算过程中出现的非数值情况。NaN还分为两类:

    • QNAN,尾数部分最高位为1,一般表示未定义的算术运算结果,最常见的如除0运算;
    • SNAN,尾数最高位为0;一般被用于标记未初始化的值,以此来捕获异常。
  • 相关阅读:
    《无垠的太空(9).利维坦陨落》第三十六章:吉姆
    早起
    《无垠的太空(9).利维坦陨落》第四十章:奈奥米
    《无垠的太空(9).利维坦陨落》第三十五章:亚历克斯
    《无垠的太空(9).利维坦陨落》第三十九章:吉姆
    为什么我没喜欢上游戏
    《无垠的太空(9).利维坦陨落》第四十一章:吉姆
    《无垠的太空(9).利维坦陨落》第三十八章:艾薇
    《无垠的太空(9).利维坦陨落》第三十七章:田中
    pytest单个用例多次运行重跑
  • 原文地址:https://www.cnblogs.com/cpcpp/p/15431021.html
Copyright © 2020-2023  润新知