2012-11-17 105 views
3

簡單的問題。在我的代碼中,我將double設置爲一個整數,如下所示:將double設置爲int而不投射是否安全?

int square_root = sqrt(sum); 

是否需要顯式強制轉換?

沒有鑄造,我似乎得到我想要的結果,即floor(sqrt(x))

sqrt(4200) = 64 
sqrt(42) = 6 
+0

如果這不是性能問題的關鍵代碼,那麼既然你想發言,爲什麼不直接調用'floor'並將其轉換爲整數,以明確你正在做什麼?如果這是性能嚴重的代碼,那麼我明白你爲什麼不想這麼做。 –

+0

不,用自己的項目euler教自己c,找不到這個簡單q的答案,所以決定在這裏問這裏:)也就是說。不關鍵 –

回答

6
int square_root = sqrt(sum); 

在C相當於:

int square_root = (int) sqrt(sum); 

現在知道,如果的組成部分double不能在int中表示,行爲未定義(在這兩種情況下)。

+0

Ehm,double的整數部分如何不能表示爲int。是否因爲數值範圍太大? –

+2

@TheUnfunCat例如'int a =(double)INT_MAX + 1.0;'是未定義的行爲。 – ouah

+0

+1爲未定義的行爲 – iabdalkader

5

在功能上沒有區別,但明確的演員表會引起讀者的注意,即截斷正在進行。

+0

所以鑄造是截斷,這是地板? –

+0

@TheUnfunCat。截斷我的意思是地板,是的。在這兩種情況下,你都有這種情況,只是在明確的情況下,你可以最大限度地降低讀者可能意外地認爲不存在截斷的風險 –

2

如果您的數字的平方根是整數,它不會影響。但如果它是一個實數(例如10的平方根),則會得到一個截斷的整數,這可能會給您的程序帶來不便。

相關問題