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

use*_*784 0 c windows gcc mingw

我使用Windows 7与MinGW/GCC 4.7.1.我试图double ans = pow(2,1000)在C中执行.我发现ans无论我在改变数据类型方面做了什么都无法正确打印.

但是,我读(这里,实际上,在最底部页),如果同样的事情都在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;
}
Run Code Online (Sandbox Code Playgroud)

Kei*_*son 6

你提出的问题与你所看到的问题无关.

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

的值pow(2, 1000)(或者,更等效并且更清楚地,pow(2.0, 1000.0)为2.0 1000由于它是,它可以准确地表示的二的幂-但数的相对精度,大型是非常粗糙的.

double值通常精确到大约只有15个左右十进制数.

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

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

10715086071862673000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000

10715086071862673209484250490600018105614050000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000

10715086071862673209484250490600018105614048117055336074437503883703510511249361
22493198378815695858127594672917553146825187145285692314043598457757469857480393
45677748242309854210746050623711418779541821530464749835819412673987675591655439
46077062914571196477686542167660429831652624386837205668069376
Run Code Online (Sandbox Code Playgroud)

最后一次恰好等于2 1000.

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

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