2010-04-04 78 views
0

我編碼了的Interpolation Search在C.輸入一個浮點值或使用math.h floor *函數?

實現的問題其實很簡單,我需要使用浮點運算做線性插值來找到正確的指數,這最終將成爲一個整數結果。

特別我的探測器索引是:

t = i + floor((((k-low)/(high-low)) * (j-i))); 

其中,I,J,K,T是無符號的整數,和高,低雙打。

這將是等效於:

t = i + (unsigned int)(((k-low)/(high-low)) * (j-i)); 

是否有任何理由我真的想使用math.h中樓*功能上只是一個簡單的(INT)類型轉換?

回答

1

它們僅對正數等價。從C99規範(§6.3.1.4/ 1):

當真實FL浮動類型的無限值轉換爲比_Bool, 以外的整數型小數部分被丟棄(即,值被截斷朝向零)。如果值爲 整數部分不能用整數類型表示,則行爲是不確定的。

因此,對於正數,浮點值轉換爲整型的結果等同於調用floor,但對於負數等同於調用ceil

+0

我明白了,感謝您的詳細信息。好消息是:((k-低)/(高 - 低))*(j-i)如果算法編碼正確(因爲它是到數組中的索引),則保證大於等於0。 所以這似乎是一個合適的選擇。 謝謝。 – nobody 2010-04-04 06:57:55

+1

@nobody:注意從性能的角度來看,轉換爲整型可能不會比使用「floor」更快。投射到一個整型可能需要寫入內存(在x86上,它幾乎保證),而調用'floor'可能不會,因爲它的結果是一個浮點值。您的里程可能會有所不同,但請注意過早和/或誤導性的優化。 – 2010-04-04 07:04:52

2

他們是不同的,如果值是0 <

floor(-1.5) = -2.0 
(int)-1.5 = 1 
0

在你的情況下,他們是等價的。但對於負數,

g++> printf("%g %d %u\n", floor(-5.5), (int)(-5.5), (unsigned)(-5.5)); 
-6 -5 0 

(實際上,鑄負實數≤-1到無符號整數,是實現定義(或未定義行爲?)。)

此外,floor返回一個double,所以i + floor(...)將作爲浮點運算而不是整數運算來執行。

+0

將一個負實型值轉換爲一個無符號整型是未定義的:「如果整型部分的值不能用整型表示,則行爲不確定」(§6.3.1.4/ 1)。這有點有趣,因爲將一個負整數值轉換爲無符號整型_is_ well-defined:「如果新類型是無符號的,則通過重複加或減一個比最大值新的類型,直到值在新類型的範圍內「(§6.3.1.3/ 2)。 (來自C99規範的引用)。 – 2010-04-04 07:20:17

+0

@James:腳註(50)寫入*「將整數類型的值轉換爲無符號類型時執行的剩餘操作不需要在將實際浮動類型的值轉換爲無符號類型時執行。」*這似乎表明預期的轉換是'真實 - >有符號 - >無符號',這使我不確定它應該是未定義的(如6.3.1.4)還是實現定義的(6.3.1.3)。 – kennytm 2010-04-04 07:39:58