2015-09-26 27 views
-1

所以我試圖在c(IDE = DEV C++)中獲取pi的值,所以我在這裏使用long double,結果它給了我一整套的零 這裏是程序Pi in C language

int main() 
{ 
    long double rootOf3; 

    rootOf3 = (22.0/7.0); 

    printf("%lf", rootOf3); 
    system("pause"); 
    return 0; 
} 

後,我發現了圓周率的值是不是在C精確和文件math.h.已經宣佈,當我試圖用這個代碼

int main() 
{ 

    printf("%f", M_PI); 
    printf("%e", M_PI); 
    printf("%lf", M_PI); 
    system("pause"); 
    return 0; 
} 

得到i的值得到這些值

3.1415933.141593e+0003.141593Press any key to continue . . . 

所以我的問題

1)什麼是在第一個程序錯誤,並使用我可以得到圓周率的值與上面的代碼長雙
2)是真的,在C PI值是不是準確?一​​個爲什麼我沒有得到在math.h中分配

感謝

+0

閱讀更多關於[printf的(3)](http://man7.org/linux/man-pages/man3/printf。 3.html)。代碼'printf(「%e \ n」,M_PI);'etc ...閱讀關於variadic參數傳遞和提升'float'參數爲'double' –

+10

由於其本質,Pi永遠不會被精確計算。 – alk

+0

請查閱http://floating-point-gui.de/ –

回答

3

用於打印long double整個圓周率值,使用"%Lf"。對long double使用"%lf"會導致未定義的行爲。

#include <stdio.h> 

int main() 
{ 
    long double pi = 22.0/7.0; 
    printf("%Lf\n", pi); 
    printf("%lf\n", pi); 
    return 0; 
} 

輸出:

3.142857 
0.000000 

更新,響應OP的評論

這是很難看到如何準確一些使用floatdouble,並long double使用默認的代表設置在printf。通過使用在小數點後打印更多數字的格式,差異將更加清晰。

程序:

#include <stdio.h> 

void test1() 
{ 
    float pi = 22.0f/7.0; 
    printf("=== float ================\n"); 
    printf("%.25lf\n", pi); 
    printf("%lf\n", pi); 
} 

void test2() 
{ 
    double pi = 22.0/7.0; 
    printf("=== double ===============\n"); 
    printf("%.25lf\n", pi); 
    printf("%lf\n", pi); 
} 

void test3() 
{ 
    long double pi = 22.0L/7.0; 
    printf("=== long double ==========\n"); 
    printf("%.25Lf\n", pi); 
    printf("%Lf\n", pi); 
} 

int main(void) 
{ 
    test1(); 
    test2(); 
    test3(); 
    return 0; 
} 

輸出:

=== float ================ 
3.1428570747375488281250000 
3.142857 
=== double =============== 
3.1428571428571427937015414 
3.142857 
=== long double ========== 
3.1428571428571428572357888 
3.142857 
+1

您仍然錯過了一個關鍵部分:計算'22.0/7.0'只用'double'精度完成。 – fuz

+0

如果我使用一個長的雙倍,我應該得到更多的精度或更多數字的浮點數?如果它使我具有與普通浮點數相同的值,它的用途是什麼 –

+0

@psraganvesh由於'22.0'和'7.0'類型都是'double',所以'22.0/7.0'分區以'double'精度完成。使用'22.0l/7.0l'進行長雙精度分割。 – fuz