2011-08-30 125 views
-1

我在CUDA中完成了我的論文,但我遇到了最後一個問題,那就是舍入浮點數。浮動四捨五入問題

我有一個名爲bin的整數變量,即x + y * X_dim的編碼。鑑於斌我想找到x和y coordenates發起它,所以我可以做一個對稱性計算。這是我原來的計劃:

float yaux,xaux; 
    yaux=(float)floorf((float)bin/((float)DETECTOR_X_DIM)); 


    if(abs(yaux-floorf(yaux)) < 0.0001) 
    yaux=floorf(yaux); 
    else 
    yaux=ceilf(yaux); 


    xaux=(float)((float)(((float)bin/((float)DETECTOR_X_DIM))-(float)yaux)*((float)DETECTOR_X_DIM)); 

    return (int)xaux; 

    if(abs(xaux-floorf(xaux)) < 0.0001) 
    xaux=floorf(xaux); 
    else 
    xaux=ceilf(xaux); 
    return (int)xaux; 


    xaux = (float)DETECTOR_X_DIM - xaux -(float)1; 

    return (int)xaux+(int)yaux*DETECTOR_X_DIM; 

的問題是,它適用於探測器的一些二進制位,但它不爲別人打工(它返回xaux加1)。有沒有更好的辦法呢?

預先感謝您

+1

您發佈的代碼應該代表什麼?大概不是你正在使用的*實際*代碼,因爲作爲閱讀,它完全沒有意義。超過一半的代碼是完全多餘的。 – talonmies

+0

看起來你錯過了一些大括號?無論是或大部分的代碼是無法訪問... –

+0

對不起,我做了一些改變,我忘了評論前兩個回報。我想我有點使用函數roundf,並把xaux = roundf(xaux),而不是與floor(xaux)的比較 – Bernardo

回答

1

我假設你意味着bin = x+y*X_dim其中x,y是整數索引您希望恢復給一個浮點數bin(不是必需的整數)和已知的整型常量X_dim。我基於你的其他問題(CUDA kernel's vectors' length based on threadIdxCUDA 3D matrix index),你的代碼更具可讀性。在這種情況下,你想要的Matlab's sub2idx function簡化等效:

void Sub2Idx(int& x, int& y, float bin, int X_dim) { 
y = (int)(bin/X_dim); 
x = (int)(bin) - y*X_dim; 
} 

不過,我以爲你要沿x軸的向下取整bin。雙線性插值可能更合適,但對於這樣一個不清晰的問題,這是太多的假設。

+0

對不起這個問題。基本上我有一個bin,我想在xaxis周圍找到它的對稱(bininverse)。所以我必須找到起始正常bin的x和y整數。之後,我找到x_symmetric並找到像x_symmetric + y * X_dim這樣的對稱bin。問題在於正在進行的舍入不適用於所有探測器箱。我剛剛證實我解決了這個問題,使用了xaux = roundf(xaux)而不是代碼中顯示的比較。無論如何,並且對於壞帖問題抱歉 – Bernardo

+0

您可能想使用'rintf()'而不是'roundf()',它會更快。這與稍微不同的是,它會變成最接近的關係,甚至會達到平均水平,而不是從關係中取零。如果這部分代碼位於內部循環中,則可能會影響性能。 –