2014-09-06 86 views
0

這是我寫的代碼,找到約平方根非完美數字(按照0.0001的順序,也是完美平方的精確平方根,它與非完美。平方數,但並不完美。當我把25它給5.000068查找數字的近似平方根

#include<stdio.h> 
int main() 
{ 
    float a,i,count; 
    scanf("%f",&a); 

    for(count=1;(1);count=count+0.0001) 
    { 
     i=count*count; 
     if (i<=a) 
     break; 
    } 
    printf("%f",count); 
    return 0; 
} 
+1

幾乎好像你正在運行到一個浮點精度問題。 – hd1 2014-09-06 04:57:43

+0

@ hd1但是我把i> = a。所以當count = 5時爲什麼不打印5 – 2014-09-06 05:01:01

+1

[C-浮點精度]可能重複(http://stackoverflow.com/questions/9577179/c-浮點精度) – 2014-09-06 05:01:46

回答

1

有兩件事情是錯誤的與您的代碼:

浮點並不確切如果你想更精確,使用double,而不是float

您的增量值太大。如果你通過一個較小的量增加,你會(或應該)得到所需的值:在這裏看到:http://ideone.com/7XM2IK

下一個問題現在已經不影響你的代碼,但無論如何要注意:

不要使用浮點運算作爲循環計數器。要解決此問題,規範你的循環做整型數,並做內循環浮點:

int count; 
float dCount = 1.0; 
float i, a; 
//... 
for (count=0; count < 100000; ++count) 
{ 
    //... 
} 

請參閱此鏈接:https://www.securecoding.cert.org/confluence/display/java/NUM09-J.+Do+not+use+floating-point+variables+as+loop+counters

+1

在這種情況下,問題不是for循環,因爲結束條件根本不使用浮點變量。你的代碼會給出相同的結果5.000068(其中OP預計爲5.0) – 2014-09-06 05:15:12

+0

你可能想用= 25 – user3386109 2014-09-06 05:25:01

+0

來測試你的代碼是的,增量值太大(0.0001)。然而,這是一個尋找平方根的非常幼稚的實現。 – PaulMcKenzie 2014-09-06 05:43:12

2

你的方法是錯誤的計算平方根。

由於沒有閱讀關於square roots的一些信息,你應該得到一個不錯的成績。理解這個問題是任何軟件開發的第一步。

首先,你應該閱讀The Floating Point Guide和經典的每個程序員應該知道什麼關於浮點運算。它解釋了爲什麼你的程序無法工作(即給出不準確的結果)。然後,你的程序非常低效(對於像數十億這樣的大輸入數字,需要大量的計算時間;對於像0.01這樣的非常小的數字,它可能永遠不會終止)。瞭解Newton-Raphson's method,也許通過閱讀一些基本的數學書。

注意許多fixpoint計算轉化爲迭代算法。

1

,如果你不想用書和數學奮鬥:

#include <stdio.h> 
#include <math.h> 
int main() 
{ 
    float n = 25;// ofc use scanf xD 

    n=sqrt(n); 

    printf("%.5f", n); 


return 0; 
} 
+3

但是,也許這個練習是爲了*實現類似於'sqrt'的東西' – 2014-09-06 06:21:55

+0

當然,但是如果他不想深入,那對他來說已經足夠了:) 我完全同意你的看法! :) – Aleksa 2014-09-06 06:33:54

+3

這就是我們如何結束沒有受過教育的畢業生.. – 2014-09-06 07:04:22