如何检查IEEE754溢出范围

时间:2014-08-17 08:02:28

标签: ieee-754

考虑将2个浮点数a和b加倍 假设expA = 127,expB = 10
乘法有效数给出1.101 x 2 ^ 137
所以137> = 127> = -126所以有溢出
如果-126> = resultExp,那么有下溢

在这里我不知道如何得到127和-126
127(因为01111111?)
-126(因为10000010?)为什么不是10000000

如果exp是5位怎么办? 01111> = x> = 10010?

2 个答案:

答案 0 :(得分:0)

请参阅: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
    
  • 在e中是float f的指数

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

因此a*b=c的解决方案是:

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

答案 1 :(得分:0)

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

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

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