浮点运算中的整数转换



我目前面临以下困境:

1.0f * INT32_MAX != INT32_MAX

评估1.0f * INT32_MAX实际上给了我INT32_MIN

我对此并不完全感到惊讶,我知道浮点到整数的转换并不总是准确的。

解决这个问题的最佳方法是什么?

我正在编写的代码是缩放有理数数组:从-1.0f <= x <= 1.0fINT32_MIN <= x <= INT32_MAX

代码如下:

void convert(int32_t * dst, const float * src, size_t count){
    size_t i = 0;
    for (i = 0; i < count; i++){
        dst[i] = src[i] * INT32_MAX;
    }
}

以下是我最终得到的结果:

void convert(int32_t * dst, const float * src, size_t count){
    size_t i = 0;
    for (i = 0; i < count; i++){
        double tmp = src[i];
        if (src[i] > 0.0f){
            tmp *= INT32_MAX;
        } else {
            tmp *= INT32_MIN;
            tmp *= -1.0;
        }
        dst[i] = tmp;
    }
}

在IEEE754中,2147483647不能用单精度浮点表示。快速测试表明,1.0f * INT32_MAX的结果被四舍五入为2147483648.0f,这不能用整数表示

换句话说,实际上是对int的转换导致了问题,而不是浮点计算,后者恰好只有1!

无论如何,解决方案是使用double进行中间计算。2147483647.0可以作为双精度数字。

最新更新