zoukankan      html  css  js  c++  java
  • 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;一般被用于标记未初始化的值,以此来捕获异常。
  • 相关阅读:
    linux下shell显示-bash-4.1#不显示路径解决方法
    update chnroute
    An error "Host key verification failed" when you connect to other computer by OSX SSH
    使用dig查询dns解析
    DNS被污染后
    TunnelBroker for EdgeRouter 后记
    mdadm详细使用手册
    关于尼康黄的原因
    Panda3d code in github
    Python实例浅谈之三Python与C/C++相互调用
  • 原文地址:https://www.cnblogs.com/cpcpp/p/15431021.html
Copyright © 2011-2022 走看看