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