2010-11-24 12 views
1

改寫問題:爲什麼分區(?)產生這個數字?

下面的代碼(不是C++ - 寫在內部腳本語言)

if(A*B != 0.0) 
{ 
    D = (C/(A*B))*100.0; 
} 
else 
{ 
    D = 0.0; 
} 

收益率D.一個的

90989373681853939930449659398190196007605312719045829137102976436641398782862768335320454041881784565022989668056715169480294533394160442876108458546952155914634268552157701346144299391656459840294022732906509880379702822420494744472135997630178480287638496793549447363202959411986592330337536848282003701760.000000

值我們100%確定A != 0.0。我們幾乎100%確定B == 0.0。我們從不使用這種無限小的值(接近0.0但不是0.0),例如B的值,即C的這個值所暗示的值。它從我們的數據中獲得價值是不可能的。當B爲0時,A*B可以產生任何不等於0.0的東西嗎?

+0

所以如果這不是C++,爲什麼它有一個C++標記?(當然,你如何期望人們能夠向你解釋你自己的內部腳本語言是如何工作的;)) – jalf 2010-11-25 02:09:39

回答

2

你除以的數字是而不是其實0非常非常接近。

+0

這是這種情況:( – nakiya 2010-12-16 05:27:47

0

這看起來像是從以前的計算中產生的錯誤,所以你divison是一個非常小的小數,但不是零。如果你想要捕捉這樣的錯誤,你應該添加一個錯誤的邊界,僞代碼:if(num < margin_of_error) ret inf;,或者使用epsilon方法更安全

1

假設你使用的是IEEE浮點數,使用平均值不是一個好主意或者在這種情況下不等於浮點數。即使像-0.0和+0.0這樣的相同值,它們也不等於按比例的角度,這是等值線所做的。即使使用其他浮動格式,也不鼓勵平等和不平等。

取而代之的是某種範圍e = a * b;如果((e < 0.0002)||(e> 0.0002)then ...

相關問題