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

Posted

技术标签:

【中文标题】使用 C:如何确定浮点组件的大小?【英文标题】:Using C: How can I determine the sizes of the components of a floating point? 【发布时间】:2008-11-02 14:31:44 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

查看float.h 中定义的值。这些应该为您提供所需的值。

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

比较容易找到:

十进制或二进制;

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);

您正在添加递减项,直到达到尾数的容量。它为浮点数返回 24 位,为双精度返回 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),则您有(就像浮点数和双精度数一样)次正规。 通常正负值是对称的(可能有一个偏移量),但您可以通过添加负值来调整测试。

【讨论】:

【参考方案5】:

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

                      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

编辑:正如乔纳森在 cmets 中指出的那样,我省略了 long double 类型。我将把它的位分解作为练习留给读者。 :)

【讨论】:

不正确,对于某些值为 true ;^)~ 存在少数不使用 IEEE754 的平台。但在大多数情况下,您当然是正确的。 @Don: 非常 小值的 true。 :) @Jonathan:谢谢,我编辑了我的回复。 Long double 是对标准的较晚添加,但至少值得一个脚注。

以上是关于使用 C:如何确定浮点组件的大小?的主要内容,如果未能解决你的问题,请参考以下文章

你如何确定C中文件的大小?

如何确保跨平台的浮点大小相同?

使用类组件时如何根据屏幕大小断点更改Material UI Button组件的prop

在 Cocoa 中使用/存储浮点数组

如何确定一个进程的“虚拟大小”(WinXP)?

嵌入式应用程序的浮点库