乍一看,我的问题可能有点奇怪;但将双精度值转换为浮点值并不是我想要的。因为当您强制转换它时,您只是失去了与IEEE-754定义的规则相关的一些精度,并且不能实现双精度值到浮点数范围的实际映射;它是无用的。下面的表达式可以工作,但当您有大量输入时,它会非常非常昂贵:
float mappedVal = (float)((val * MAX_FLOAT_VALUE + 1) / MAX_DOUBLE_VALUE);
我可以通过某种逐位运算来加速相同的计算,从而将结果近似为上面提到的"mappedVal“吗?
发布于 2013-03-15 09:43:55
我不确定您想要实现什么,因为一些双精度值远远超出了浮点数的范围。
但是,如果您愿意冒丢失对于float来说太大的值的风险,请尝试以下方法:
float f = new Double(val).floatValue();
Edit:这与强制转换为float完全相同。:)
发布于 2013-03-15 16:25:36
这会将双精度值映射到具有相同最高32位的浮点数中:
float mappedVal = Float.intBitsToFloat((int)(Double.doubleToLongBits(val)>>32));
这个运算的算术解释有点复杂,指数的一部分被映射到尾数...
https://stackoverflow.com/questions/15428237
复制