当前位置:  开发笔记 > 编程语言 > 正文

浮点运算中的整数转换

如何解决《浮点运算中的整数转换》经验,为你挑选了1个好方法。

我目前面临以下两难困境:

1.0f * INT32_MAX != INT32_MAX

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

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

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

我正在编写的代码是缩放有理数的数组:from -1.0f <= x <= 1.0ftoINT32_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;
    }
}

Mr Lister.. 6

在IEEE754中,2147483647在单精度浮点数中不可表示.快速测试显示1.0f * INT32_MAX舍入到 的结果,2147483648.0f无法用int表示.

换句话说,它实际上是转换为int导致问题,而不是浮点计算,恰好只有1关!

无论如何,解决方案是double用于中间计算.2147483647.0可以作为双精度数.



1> Mr Lister..:

在IEEE754中,2147483647在单精度浮点数中不可表示.快速测试显示1.0f * INT32_MAX舍入到 的结果,2147483648.0f无法用int表示.

换句话说,它实际上是转换为int导致问题,而不是浮点计算,恰好只有1关!

无论如何,解决方案是double用于中间计算.2147483647.0可以作为双精度数.

推荐阅读
135369一生真爱_890
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有