乍一看,我的问题似乎有点奇怪。但将双精度值转换为浮点值不是我想要的。因为当你转换它时,你只是失去了 IEEE-754 定义的规则的一些精度,并且无法实现双精度值到浮点范围的实际映射;这是没用的。以下表达式有效,但是当您有大量输入时,它非常昂贵:
float mappedVal = (float)((val * MAX_FLOAT_VALUE + 1) / MAX_DOUBLE_VALUE);
我可以通过某种按位运算将结果近似为上述“mappedVal”以加速相同的计算吗?
乍一看,我的问题似乎有点奇怪。但将双精度值转换为浮点值不是我想要的。因为当你转换它时,你只是失去了 IEEE-754 定义的规则的一些精度,并且无法实现双精度值到浮点范围的实际映射;这是没用的。以下表达式有效,但是当您有大量输入时,它非常昂贵:
float mappedVal = (float)((val * MAX_FLOAT_VALUE + 1) / MAX_DOUBLE_VALUE);
我可以通过某种按位运算将结果近似为上述“mappedVal”以加速相同的计算吗?
我不确定您要达到什么目的,因为某些双精度值远远超出了浮点数的范围。
但是,如果您愿意冒险丢失太大而无法浮动的值,请尝试以下操作:
float f = new Double(val).floatValue();
编辑:这与铸造浮动完全相同。:)
这将一个双精度值映射到具有相同最高 32 位的浮点数中:
float mappedVal = Float.intBitsToFloat((int)(Double.doubleToLongBits(val)>>32));
这个操作的算术解释虽然有点复杂,部分指数被映射到尾数......