2013-03-21 89 views
-2

我必須計算一些簡單的數學表達式,但是當我在一行中完成時,結果總是爲零。但是,正確的結果顯然不是零。其有趣的,但當我分開表達的部分,我得到了正確的答案。 後來,我將這個結果劃分,因此它不應該是0。C++數學表達式的錯誤結果

表達是這樣的:

(X-X1)/(X2-X1) 

在這種情況下增量:0

double delta = (x - x1)/(x2 - x1); 

但這樣delta delta將是正確的:

double top = x - x1; 
double bottom = x2 - x1; 
double delta = top/bottom; 

你有什麼想法,這是怎麼發生的?

+11

我認爲x,x1和x2是整數值,'x2-x1'大於'x-x1'? – 2013-03-21 14:47:28

+5

可能有[在Linux內核入侵前我沒有學習C的問題](http://google.com/search?q=integer+division+c) – 2013-03-21 14:49:19

+0

是的,它們是無符號long int和yes,x2 -x1是更大的。 – 2013-03-21 14:49:29

回答

10

這是「用於生成浮點值的整數除法」的典型情況。如果x,x1x2都是整數,那麼編譯器應根據C和C++的規則使用整數計算來計算x-x1x2-x1,然後將這些差值除以整數除法。如果x2-x1大於x-x1,那麼結果爲零[假設正值爲7/14。 -14/-7顯然是2]。

最簡單的解決方法是一個表達式的類型轉換爲浮點類型:

double delta = static_cast<double>(x - x1)/(x2 - x1); 
+1

而「整數除法」意味着答案被截斷,即答案的整個部分被保留,其餘部分被丟棄。所以'1/2'給出0,餘數1被拋出,給出'1/2 == 0'。 – iamnotmaynard 2013-03-21 14:53:57

+0

非常感謝,我明白了這個問題。 (我不知道如何描述我的問題,這就是爲什麼我問這個問題。) – 2013-03-21 14:56:05

2

在第一種情況下,整數/整數,結果仍然是整數,然後將整數轉換爲double。

在第二種情況下,雙/雙,然後你得到正確的結果。

1

在第一種情況下,您正在執行int/int,這將導致int值。因此,如果您分母大於分子越大,結果將被截斷爲0

在第二種情況下,你正在評估一個double/double表達,其將計算爲一個double值,因此保留了整數和小數部分。