如何长期打印

Car*_*los 49 c pi long-integer

我正在做一个接近PI的程序,我试图使用很长时间,但它不起作用.这是代码

#include<stdio.h>
#include<math.h>
typedef long long num;
main(){
    num pi;
    pi=0;
    num e, n;
    scanf("%d", &n);
    for(e=0; 1;e++){
      pi += ((pow((-1.0),e))/(2.0*e+1.0));
      if(e%n==0)
        printf("%15lld -> %1.16lld\n",e, 4*pi);
      //printf("%lld\n",4*pi);
    }
}
Run Code Online (Sandbox Code Playgroud)

kar*_*doc 63

%lld是标准的C99方式,但这对我正在使用的编译器不起作用(mingw32-gcc v4.6.0).在这个编译器上执行它的方法是:%I64d

试试这个:

if(e%n==0)printf("%15I64d -> %1.16I64d\n",e, 4*pi);
Run Code Online (Sandbox Code Playgroud)

scanf("%I64d", &n);
Run Code Online (Sandbox Code Playgroud)

我知道以完全可移植的方式执行此操作的唯一方法是使用中的定义<inttypes.h>.

在你的情况下,它看起来像这样:

scanf("%"SCNd64"", &n);
//...    
if(e%n==0)printf("%15"PRId64" -> %1.16"PRId64"\n",e, 4*pi);
Run Code Online (Sandbox Code Playgroud)

这真的很难看......但至少它是便携式的.

  • 这不是你的编译器,而是你负责的C库.您使用的是Microsoft C库,它不支持`%lld`,这是一个C99功能(尽管`inttypes.h`也是如此). (10认同)

Vin*_*ura 0

首先,%d 代表一个int

所以%1.16lld没有意义,因为 %d 是一个整数

你所做的 typedef 也是不必要的,直接使用类型,可以使代码更具可读性。

您想要使用的是 type double,用于计算 pi 然后使用%for %1.16f

  • 不正确。阅读 [printf 规范](http://pubs.opengroup.org/onlinepubs/9699919799/functions/printf.html)。`%lld` 正是打印 `long long` 的方式。(当然,“1.16”可能不会满足您的要求......但它是完全有效的。这意味着使用最小字段宽度 1 并打印 16 位数字。) (7认同)