我目前面临以下两难困境:
1.0f * INT32_MAX != INT32_MAX
评估1.0f * INT32_MAX
实际上给了我INT32_MIN
我并不完全对此感到惊讶,我知道整数转换的浮点并不总是准确的.
解决此问题的最佳方法是什么?
我正在编写的代码是缩放有理数的数组:from -1.0f <= x <= 1.0f
toINT32_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可以作为双精度数.
在IEEE754中,2147483647在单精度浮点数中不可表示.快速测试显示1.0f * INT32_MAX
舍入到 的结果,2147483648.0f
无法用int表示.
换句话说,它实际上是转换为int导致问题,而不是浮点计算,恰好只有1关!
无论如何,解决方案是double
用于中间计算.2147483647.0可以作为双精度数.