2013-12-23 63 views
7

如果我乘以下面的float和and整數,爲什麼所有的乘法都會導致不同的結果?我的期望是一致的結果。我認爲在這兩種情況下,int值都會在乘法之前隱式轉換爲浮點數。但似乎有區別。這種不同處理的原因是什麼?爲什麼int/float乘法會導致不同的結果?

int multiply(float val, int multiplier) 
{ 
    return val * multiplier; 
} 

int multiply2(float val, int multiplier) 
{ 
    return float(val * multiplier); 
} 

float val = 1.3f; 

int result0 = val * int(10); // 12 
int result1 = 1.3f * int(10); // 13 
int result3 = multiply(1.3f, 10); //12 
int result4 = multiply2(1.3f, 10); // 13 

謝謝 托爾斯滕

+0

這是真正的代碼?我得到了相同的結果,我不明白爲什麼它會有所不同。 –

+2

第二個表達式可以在編譯時評估 - 你使用的編譯器是什麼?看看它產生的字節碼。 – Floris

+0

在Ubuntu上使用g ++ 4.7.3試驗:兩個乘法都導致13 – gturri

回答

8

什麼可能發生的對你來說:

假設IEEE或類似的花車,1.3不能代表,並有可能是一樣的東西1.299999它乘以10 12.99999然後截斷爲int的值爲12.

然而,1.3 * 10可以在編譯時進行評估,最有可能是精確的表示形式13.

根據代碼的實際結構,使用什麼編譯器以及使用哪些設置,它可以評估1到12或13,具體取決於它是在運行時還是在編譯時進行。

爲了完整起見,用下面的代碼,我可以重現它:

extern int result0; 
extern int result1; 

float val = 1.3f; 

void foo() 
{ 
result0 = val * int(10); // 12 
result1 = 1.3f * int(10); // 13 
} 
+0

編譯器是否允許在編譯時計算中使用不同的表示形式? –

+0

@sftrabbit我的猜測是實現定義的 –

+0

@sftrabbit:我手邊沒有標準報價,但它是。這也是模板不允許非浮點型參數的原因。 – PlasmaHH

相關問題