2012-12-23 63 views
0

我有一個代碼:如何將短浮點類型轉換爲短類型並在短類型溢出時截斷浮點類型?

if (Ly0 > 32767) { 
     buffer[index] = 32767; 
    } else if (Ly0 < -32768) { 
     buffer[index] = -32768; 
    } else { 
     buffer[index] = (short) Ly0; 
    } 
  • buffer是短型。
  • Ly0是浮點型。

我需要投浮子短,如果超過短最大值短浮子的整數部分應該是等於短最大值,並且如果浮子小於短最小值短應的整數部分等於短最小值,在其他情況下,我需要將float轉換爲short並獲取float的整數值。

換句話說我需要從float轉換爲短和截斷浮子如果它拉出的短範圍。

的問題是,這種做法是不enouth快,的Durty。

是任何更快,乾淨的方法,以浮動轉換爲短。

+0

我想你錯過了第二個分支的減號。 – kennytm

+0

只需更改代碼的那一部分,您永遠不會足夠快。你需要顯示整個循環,因爲這是緩慢的,而不是上面的代碼。 –

回答

3

隨着上證所內部函數可以先轉換爲整數,然後執行一個長整型到短整型飽和轉換(與PACKSSDW)。

「便攜式」的方法是使用例如ORC,這是一個運行時編譯庫,用於優化使用mmx,sse,neon和avs的innerloops;以及提供兼容的串行實現。

即使在此之前,一個可能要檢查的編譯器輸出。例如。與gcc -ffast-math -O3等,編譯器通常可以生成xmm指令和並行化大循環,其迭代計數在編譯時已知。使用「luck == brute force」,人們可以將c代碼調整爲編譯器可以識別飽和包模式的形式。通常它只取決於微觀管理中間計算的類型。 (是比較符號或無符號,它是int或短等)

-2

可能沒有辦法優化代碼的和平。我猜這個代碼在一些循環內執行很多次,因爲你有性能問題。你需要考慮優化循環。例如,如果Ly0值處於隨機存取容器中,則優化後可能會產生良好結果。

for (int index = 0; index < (Ly0s.size() - 4); idx += 4) { 
    do_conversion_for(index); 
    do_conversion_for(index + 1); 
    do_conversion_for(index + 2); 
    do_conversion_for(index + 3); 
} 
switch (Ly0s.size() % 4){ 
    case 3: 
     do_conversion_for(index + 3); 
    case 2: 
     do_conversion_for(index + 2); 
    case 1: 
     do_conversion_for(index + 1); 
} 

代替

for (int index = 0; index < Ly0s.size(); ++idx) { 
    do_conversion_for(index); 
} 
0

如果你有一個合理的明亮的編譯器,你實際上是這樣做在一個循環 - 假設你給編譯器「優化的很好的提示這個「,那麼它應該能夠弄清楚你在做什麼並且使用」聰明「的指令,比如SSE/SSE2--假設你編譯的處理器支持它,當然。否則,使用編譯器特定的擴展或內聯彙編程序將是您的選擇 - gcc和MS編譯器都有內在功能來執行此類操作 - 或者,如所建議的那樣,可能有外部庫可以很好地執行此操作。再次假設處理器支持這種操作。

最後一個建議,這可能是因爲它的速度更快做這樣的事情(在某些處理器):

int x = Ly0; 
if (x > 32767) x = 32767; 
else if (x < -32768) x = -32768; 
buffer[index] = (short)x; 

原因是,浮點比較有時比整那些更昂貴的 - 和編譯器可能會更好地優化此代碼。但不能保證 - 一如既往,基準和比較。查看編譯器輸出並且看看你是否認爲它也是有意義的!

編輯:上面的代碼假定這些值不是很遠離您的預期範圍。對於40億以外的值,它會出錯。如果發生這種情況,那麼無論如何你都需要使用浮點比較。

相關問題