使用C:如何确定浮点组件的大小?

时间:2008-11-02 14:31:44

标签: floating-point exponent mantissa

我正在寻找有关如何以独立于架构的方式查找浮点数的大小(以位为单位)和范围的建议。代码可以使用不同的标志在各种平台(AIX,Linux,HPUX,VMS,也许是Windoze)上构建 - 因此结果应该有所不同。标志,我只看到一点,但如何衡量指数和尾数的大小?

5 个答案:

答案 0 :(得分:5)

由于您正在考虑构建多个系统,我认为您可能正在考虑使用GCC进行编译。

关于浮点的一些好消息 - 这几乎是所有现代架构使用的: http://en.wikipedia.org/wiki/IEEE_754

详细介绍了可能出现的一些差异 http://www.network-theory.co.uk/docs/gccintro/gccintro_70.html

答案 1 :(得分:3)

查看float.h中定义的值。那些应该给你你需要的价值。

答案 2 :(得分:3)

当您按照之前评论中建议的链接进行操作时,您可能会看到对What Every Computer Scientist Should Know About Floating Point Arithmetic的引用。无论如何,请花点时间阅读本文。当讨论浮点时,它会随处出现。

答案 3 :(得分:2)

相对容易找到:

十进制或二进制;

myfloat a = 2.0,
        b = 0.0;

for (int i=0; i<20; i++)
  b += 0.1;

(a == b) => decimal, else binary

原因:所有二进制系统都可以代表2.0,但任何二进制系统都有 表示0.1的错误术语。通过累积,您可以确定此错误术语不会像舍入一样消失:例如即使在二进制系统中,1.0 == 3.0 *(1.0 / 3.0)

尾数长度:

Myfloat a = 1.0,
        b = 1.0,
        c,
        inc = 1.0;

int mantissabits = 0;

do {
 mantissabits++;
 inc *= 0.5;   // effectively shift to the right
 c = b+inc;
} while (a != c);

您要添加减少的字词,直到达到尾数的容量。它为float提供24位,为double提供53位,这是正确的(尾数本身只包含23/52位,但由于第一位在标准化值上总是一位,所以你有一个隐藏的额外位)。

指数长度:

Myfloat a = 1.0;
int max = 0,
    min = 0;

while (true) {
 a *= 2.0;
 if (a != NaN && a != Infinity && whatever) // depends on system
   max++;
 else
   break;
}

a = 1.0;
while (true) {
 a *= 0.5;
 if (a != 0.0) 
   min--;
 else
   break;
}

您向左或向右移动1.0,直到您到达顶部或底部。 通常,exp范围是-(max+1) - max

如果min小于-(max+1),则您有(如浮点数和双精度数)次正规值。 通常正值和负值是对称的(可能有一个偏移量),但您可以通过添加负值来调整测试。

答案 4 :(得分:1)

用于在浮点数中存储每个字段的位数不会改变。

                      Sign      Exponent    Fraction    Bias
Single Precision    1 [31]     8 [30-23]      23 [22-00]         127
Double Precision    1 [63]    11 [62-52]      52 [51-00]        1023
编辑:正如Jonathan在评论中指出的那样,我遗漏了long double类型。我会把它的分解作为练习给读者。 :)