数据类型大小因计算机而异吗?

时间:2012-07-10 23:01:15

标签: c windows gcc mingw

我正在使用Windows 7和MinGW / GCC 4.7.1。我试图在C中执行double ans = pow(2,1000)。我发现ans无法正确打印,无论我尝试改变数据类型。

但是,我读到(这里,实际上,在this页面的最底部),如果在Linux计算机上运行相同的东西,它将正确打印。

我知道我的MinGW文件夹中的limits.h文件中对char,int和long long施加的限制,但是double和float的限制在哪里?从一个操作系统或体系结构到下一个操作系统或架构是否可以这些?

编辑:

这是代码,它打印出截断的,零填充的答案:

#include <stdio.h>
#include <math.h>

int main(void)
{
   double ans = pow(2,1000);

   printf("%.0f", ans);

   return 0;
}

3 个答案:

答案 0 :(得分:6)

您提出的问题与您所看到的问题无关。

您使用的所有系统很可能使用类型double的相同表示形式,即64位IEEE双精度。

pow(2, 1000)的值(或者,更明确地,pow(2.0, 1000.0),是2.0 1000 。因为它是2的幂,所以它可以准确表示 - - 但是大数字的相对精确度非常粗糙。

double值通常精确到大约15个十进制数字。

显然,Linux系统上使用的printf的glibc实现会尝试打印值的完整十进制表示,而其他printf实现会替换15个左右的部分或全部数字。带有零的重要位数。后者可能更容易实现,但两种方法都是有效的。

在几个不同的系统上运行你的程序,我得到以下结果(折叠线条以便于阅读):

10715086071862673000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000

10715086071862673209484250490600018105614050000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000

10715086071862673209484250490600018105614048117055336074437503883703510511249361
22493198378815695858127594672917553146825187145285692314043598457757469857480393
45677748242309854210746050623711418779541821530464749835819412673987675591655439
46077062914571196477686542167660429831652624386837205668069376

最后一个恰好 等于2 1000

你打印的数字很不寻常,因为它非常大可以完全代表 - 而且glibc需要额外的努力才能完全打印它。但更一般地说,浮点值往往是不精确的,并且很少值得担心前几个数字之后的任何数字。

例如,pow(2.0, 1000.0) + 1.0 无法完全表示,如果您尝试计算它,您可能会得到与pow(2.0, 1000.0)完全相同的结果。

答案 1 :(得分:3)

floatdouble 的大小可以因实施而异。

我们保证double永远不会小于float,并且long double永远不会小于double - 类似于long long的保证, longintshort

答案 2 :(得分:3)

是的,float和double 等类型的实现可以因平台而异。

但是,最常见的现代平台使用IEEE 754,这是浮点类型的标准。因此,除非你在一个不寻常的平台上,否则这些类型之一的二进制表示不太可能会有所不同。

您提到的另一个主题似乎突出了打印程序准确性的潜在差异。这并不意味着表示形式不同(或大小不同)。