我做了aproximate 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);
}
}
%lld
是C99标准的方式,但是,这并不对我使用(的mingw32-GCC v4.6.0),编译工作。 做该编译器的方法是: %I64d
所以,试试这个:
if(e%n==0)printf("%15I64d -> %1.16I64d\n",e, 4*pi);
和
scanf("%I64d", &n);
我知道在一个完全可移植的方式这样做的唯一方法是使用在定义<inttypes.h>
。
在你的情况下,它应该是这样的:
scanf("%"SCNd64"", &n);
//...
if(e%n==0)printf("%15"PRId64" -> %1.16"PRId64"\n",e, 4*pi);
这真的是非常难看......但至少它是便携式的。
我想用写的时候整个算法是可疑的long long
; 数据类型或许应该更像long double
(以%Lf
为scanf()
格式,也许%19.16Lf
的printf()
格式。
首先,%d是一个int
于是%1.16lld
是没有意义的,因为%d是一个整数
这类型定义你做的,也是没有必要的,使用类型正前方,使一个更可读的代码。
你想用什么类型double
,计算圆周率,然后用%f
或%1.16f
。
// acos(0.0) will return value of pi/2, inverse of cos(0) is pi/2
double pi = 2 * acos(0.0);
int n; // upto 6 digit
scanf("%d",&n); //precision with which you want the value of pi
printf("%.*lf\n",n,pi); // * will get replaced by n which is the required precision