2013-11-01 55 views
3

我正在嘗試寫一個類似Monte Carlo的C逼近。我不太熟悉它,並且正在嘗試翻譯我的基於python的技巧,所以我可能只是簡單地忽略某些東西。我一直得到0結果,我不明白爲什麼。我應該如何解決這個問題?另外,在最後兩個printf呼叫中,我收到錯誤消息,說他們是double *而不是double。它編譯反正,這是相關的嗎?在printfC中的Pi逼近 - 爲什麼我會得到近似值爲0的結果?

#include <stdio.h> 
/* 
Tristen Wentling 
montepithon.c 
October 31, 2013 

*/ 
int main(void) 
{ 
    float i,j,x; 
    float count=0,counter=0; 
    printf("Please enter the desired grid division size (n=?)"); 
    scanf("%f", &x); 
    float y=x*x; 
    if(x==0){ 
     printf("goodbye"); 
    } 
    else if(x!=0){ 
     for(i=0;i<=x;i++){ 
      for(j=0;j<=x;j++){ 
       float check=((i*i)*(1/y))+((j*j)*(1/y)); 
       /*printf("%f\n", check);*/ 
       if(check<=1){ 
        count+=1; 
       } 
       else{ 
        counter+=1; 
       } 
      } 
     } 
    } 
    else{ 
     printf("error"); 
    } 
    float prsum=count/y; 
    float ptsum=(1-counter)*(1/y); 
    double pirprox=4*prsum; 
    double pitprox=4*ptsum; 
    printf("%f\n", &pirprox); 
    printf("%f\n", &pitprox); 
    getchar(); 
} 
+0

警告是相同的錯誤。不要忽視它們。在這種情況下,編譯器告訴你,你傳遞一個變量的地址而不是變量本身。請遵照其建議。否則,你將看不到你的代碼的結果。此外:(1)SO不是代碼審查站點,(2)如果您發佈代碼(當您有具體的技術問題時),請將其正確縮進。 –

+0

對不起。我通常會問Ubuntu和數學。我認爲這是最好的描述。這種類型的問題更適合問什麼? – Tristen

+0

你意識到分工是允許的,對吧?如果寫入'/ y',則程序中每次出現'*(1/y)'會更快,更準確(更短)。 –

回答

6

%f格式說明預計double類型參數。 &pirprox&pitprox的類型爲double *,您無法使用%f打印地址。錯誤的格式說明符會調用未定義的行爲
更改您的代碼段用C

printf("%f\n", &pirprox); 

printf("%f\n", &pitprox); 

printf("%f\n", pirprox); 

printf("%f\n", pitprox); 
+2

修復後它可以很好地工作,謝謝你指出我忽略了什麼。 – Tristen

+0

'return 0;'可以在C99以後的'main()'中省略。 –

+0

@PascalCuoq;是的你可以。但是將它添加到'main'並不算差。看看C11規範:** 5.1.2.2.3:**'如果主函數的返回類型是與int兼容的類型,則從主函數初始調用的返回等同於調用退出函數,主函數返回的值爲 作爲參數; 11)到達終止 主函數的返回值爲0.如果返回類型與int不兼容,則 終止狀態返回給主機環境未說明 – haccks