任何人都可以解释我或链接一些有用的资源,以了解Java方法Float.intBitsToFloat(int)
背后的算法吗?
答案 0 :(得分:7)
Java使用IEEE 754浮点。 Float.intBitsToFloat(int)
通过解释其参数的32位来工作,就好像它们以described here格式指定了32位浮点数。
Double.longBitsToDouble(long)
的工作方式类似。
在C中你可能会达到同样的效果:
#include <stdint.h>
union int_float_bits {
int32_t int_bits;
float float_bits;
};
float intBitsToFloat(int32_t x)
{
union int_float_bits bits;
bits.int_bits = x;
return bits.float_bits;
}
(虽然从技术上讲,这将是未定义的行为,但事实上它实际上总是按预期工作。)
答案 1 :(得分:5)
JDK6 docs非常好,source itself非常有启发性(它只使用了C联合):
JNIEXPORT jfloat JNICALL
Java_java_lang_Float_intBitsToFloat(JNIEnv *env, jclass unused, jint v)
{
union {
int i;
float f;
} u;
u.i = (long)v;
return (jfloat)u.f;
}
答案 2 :(得分:2)
在绝大多数现代平台上,CPU上整数的默认大小为32位,浮点数的大小也是如此,因此我们假设在两者之间进行转换不会产生意外结果。您可能已经知道这一点,但是在Java中不能将整数声明为unsigned,尽管您可以指定与1对应的十六进制值。正如rlibby和Powers先生所证明的那样,实际的转换是微不足道的,因为这些比特只是被不同地解释。但是,在您可能试图弄乱二进制数据的几种情况下,该方法可能很有用。有几个有用的非标准技巧,例如那些描述here的技巧,它依赖于利用浮点数的IEEE 754表示;也许在某个地方,当需要在整数和浮点表示位之间进行转换时,该方法可能会被使用。