【问题标题】:How to check IEEE754 overflow range如何检查 IEEE754 溢出范围
【发布时间】:2014-08-17 08:02:28
【问题描述】:

考虑将 2 个浮点数 a 和 b 相乘
假设 expA=127, expB = 10
乘以有效数得到 1.101 x 2^137
所以 137 >= 127 >= -126 所以有溢出
if -126 >= resultExp 所以有下溢

在这里我不确定如何获得 127 和 -126
127(因为01111111?)
-126(因为 10000010?)为什么不是 10000000

如果 exp 是 5 位呢? 01111 >= x >= 10010 ?

【问题讨论】:

    标签: ieee-754


    【解决方案1】:

    浮点中的指数部分,至少在 IEEE 754 中,如您所说,没有用 2 的补码表示,它表示如下:

    假设指数部分的宽度为 n:

    1. 全零,000...000,即零,表示非正规以及浮点中的 +ve 或 -ve 零。
    2. 下一个表示,000...001,即 One 表示最小可能的指数,即单精度下的 -126,这意味着 0000...010 表示 -125,000...011 表示 -124 和儿子。
    3. 111...110 表示最大指数,即单精度中的 127。
    4. 111...111 表示溢出和 NaN 表示。

    【讨论】:

    • 所以如果 exp(n bits) 不全是 0/1,exp 代表 exp-111...111(n-1 bits) ?
    • 如果不是全0或全1,则指数等于Unsigned representation within n bits - (2^(n-1) - 1 )。那就是你有一个2^(n-1) -1 的偏差n 是指数部分的宽度。
    【解决方案2】:

    看到这个:IEEE-754 specs

    • 这样您就知道要提取哪些位了
    • 这个 C++ 代码应该可以工作

      int e;
      float f=1.5e+34;
      unsigned int u;
      u=((unsigned int*)((void*)(&f)))[0];
      e=(u>>23)&&255;
           if (e==255);       // +/-Inf,NaN...
      else if (e==0) e-=128; // denormalized
      else e-=127;            // normalized
      
    • in e 是浮点 f 的指数

    • 也不要忘记尾数的乘法可以将结果的指数降低 1
    • 对于非规范化数字甚至更多

    所以a*b=c 的解决方案是:

    1. 将 a0 设置为 a,但将其指数设置为 0
    2. 将 b0 设置为 b,但将其指数设置为 0
    3. 计算c0=a0*b0
    4. 计算结果指数
    5. 添加 c0 的指数变化
    6. 现在您可以安全地测试上溢/下溢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多