2015-09-25 105 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

如果達到終止函數的},和函數調用由 使用呼叫者的價值,行爲是不確定的。