2015-09-25 66 views
2

我是新的C程序员,我正在开展一个学校项目,我必须近似值或pi。我的教授表示,我们必须使用long double来声明所有整数项。控制台显示我向用户询问用于近似pi的术语数量。我为条款数输入1,但代码返回-0.00000000而不是4.00000000。C - long double和printf问题

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

long double approx1(int terms) 
{ 
    long double pi = 0; 
    long double num = 4; 
    long double denom = 1; 
    int i; 

    for(i=1; i <= terms; i++) 
    { 
     if(i%2 != 0) 
     { 
      pi=pi+(num/denom); 
     } 
     else 
     { 
      pi=pi-(num/denom); 
     } 
     denom = denom + 2; 
    } 
    printf("%.8Lf\n", pi); 
} 

int main() 
{ 
    int terms; 
    long double pie; 

    printf("input number of terms, input 0 to cancel\n"); 
    scanf("%d", &terms); 

    while(terms != 0) 
    { 
     if(terms > 0) 
     { 
      pie = approx1(terms); 
      printf("%.8Lf\n", pie); 
      printf("GG mate\n"); 
      break; 
     } 
     else 
     { 
      printf("Incorrect input, please enter a correct input\n"); 
      scanf("%d", &terms); 
     } 
    } 
} 

我还没有得到它的任何成功的工作(它虽然适用于浮动虽然)。我究竟做错了什么? (我正在使用包含编译器btw的代码块。)

+0

“使用long double的所有整数术语”long double“不是整数类型。你什么意思? – Olaf

+1

如果您的Code :: Blocks IDE正在使用MinGW GCC编译器(我认为这很常见),那么您可能也会遇到以下问题:http://stackoverflow.com/a/7136886/12711我相信新版本的MinGW通过为'printf()'实现自定义支持来解决问题,而不是仅仅依靠使用'msvcrt.dll'。所以你可能想试试MinGW或MinGW-w64的更新版本。 –

回答

5

您忘记在approx1()函数中添加return语句。如果您使用返回值,则不会使用return语句,它会调用undefined behavior

引用C11标准,章§6.9.1

如果达到终止函数的},和函数调用由 使用呼叫者的价值,行为是不确定的。