2010-12-15 53 views
0
int n,m;   
    float S,K,R,L,dr,dz; 
    S=4.0f; 
    K=2.0f; 
    R=1.0f; 
    L=2.0f; 
    dr=0.01f; 
    dz=0.1f; 
    n=int((R/dr)+1); 
    m=int((L/dz)+1); 
    printf("%d\t%d\t",n,m); 

對於這個iam獲得10,20個網格點,但實際上值應該是11,21對於n,m rply和對於dr = 0.01其印刷n = 101,除了所有其他的'dr'值打印一個值小於dr = 0.1 n = 10,dr = 0.001 n = 1000,但實際值爲1001.請說明我已經試過一個月了,因爲一個月後我仍然沒有得到正確答案..它沒有在屏幕上打印適當的網格點數?

+0

循環在哪裏? 'n'和'm'的值如何改變? – pmg 2010-12-15 10:30:19

+1

你也可能想閱讀[每個計算機科學家應該知道的關於浮點運算的知識](http://docs.sun.com/source/806-3568/ncg_goldberg.html)。 – pmg 2010-12-15 10:41:32

回答

0

這是我不完全清楚你的問題是什麼,但你似乎對n的值爲什麼打印爲101感到困惑。冒着明顯的指出,你用純粹的數學表達式表示的是:

n = (1.0/.01) + 1 

1除以.01等於100.所以即使消除了浮點錯誤的可能性,那麼101的答案也是正確的。由於floating point error,正在打印20的值(而不是「預計」21)。你可以更清楚地看到這一點,如果您添加以下語句:

printf("%.15f\n", L/dz); 

在我的機器,它打印此:

19.999999701976780 

演員爲int的計算值(20.999的地板結果.. 。當轉換爲整數值時結束爲20)。