浮动舍入问题

时间:2011-08-30 16:07:22

标签: floating-point cuda rounding

我在CUDA完成了我的论文,但我遇到了最后一个问题,这与舍入浮点数有关。

我有一个名为bin的整数变量,它是x + y * X_dim的编码。鉴于bin我想找到起源它的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 个答案:

答案 0 :(得分: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。双线性插值可能更合适,但对于这样一个不明确的问题,这是太多的假设。