2011-06-19 266 views
40

我正在做一个程序,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); 
    } 
} 
+1

我猜你的问题更多的是'scanf'比'printf'更多。 – Nemo

+0

'pow(( - 1.0),e)'会更好地表达为'e%2? 1:-1' –

回答

-1

首先,%d是一个int

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

说typedef会做什么,也没有必要,直接使用类型,制作更易读的代码。

想要使用的是double型号,用于计算pi ,然后使用%f%1.16f

+0

这不是真的“非法”......我认为这是MSVC特有的。 – Mehrdad

+2

@Mehrdad由于整数有小数点? –

+6

不正确。阅读[spec for printf](http://pubs.opengroup.org/onlinepubs/9699919799/functions/printf.html)。 '%lld'就是你打印'long long'的方式。 (当然,'1.16'可能不会做你想要的......但它是完全有效的,这意味着使用最小字段宽度为1并打印16位数字。) – Nemo

53

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

这真的是非常难看......但至少它是便携式的。

+7

这不是你的编译器,而是你的C库在这里负责。您正在使用Microsoft C库,该库不支持'%lld',这是一个C99功能(虽然'inttypes.h'也是如此)。 – caf

+0

更具体地说,它是msvcrt.dll,它是最初为VC++ 6.0编写的C标准库的古老(大约1998年)版本,并且为了向后兼容的目的而附带Windows。 MinGW使用这个古老的版本,因为这是唯一一个与Windows开箱即用的软件。但现代VC++运行时正确处理'%lld'。 –

+0

Visual C++ 2013似乎支持%lld格式元素 – user1741137

2
  • 您的scanf()声明也需要使用%lld
  • 您的环路没有终止条件。
  • 有太多的括号太少空间中表达

    pi += pow(-1.0, e)/(2.0*e + 1.0); 
    
  • 您在循环的第一次迭代中增加一个,之后零“P1”的价值;这并没有太大的改变。
  • 对于main(),您应该使用显式返回类型int
  • 总体而言,最好在忽略它的参数时指定int main(void),尽管这不像其他参数那么明确。
  • 我不喜欢在C99中授予的显式许可从main()末尾省略返回,并且不要自己使用它;我写return 0;是明确的。

我觉得整个算法在使用long long编写时是可疑的;数据类型可能应该更像long double(对于scanf()格式的%Lf,对于printf()格式可能为%19.16Lf

0
double pi = 2 * acos(0.0); 
    int n; 
    scanf("%d",&n); //precision with which you want the value of pi 
    printf("%.*lf\n",n,pi); 
+1

尽管此代码片段可能是解决方案,但包含解释确实有助于提高帖子的质量。请记住,您将来会为读者回答问题,而这些人可能不知道您的代码建议的原因 –