问题描述
|
谁能解释我或链接一些有用的资源,以便理解Java方法
Float.intBitsToFloat(int)
背后的算法?
解决方法
Java使用IEEE 754浮点。
Float.intBitsToFloat(int)
的工作方式是解释其参数的32位,就像它们以此处描述的格式指定了32位浮点数一样。
Double.longBitsToDouble(long)
对于64位浮点型的工作方式与此类似,如下所述。
在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;
}
(尽管从技术上讲这是未定义的行为,但实际上,它实际上总是按预期运行。)
,JDK6文档非常出色,源代码本身也很有启发性(它仅使用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;
}
,在绝大多数现代平台上,CPU上整数的默认大小为32位,浮点数的大小也是如此,因此我们假设在两者之间进行转换不会产生意外结果。您可能已经知道这一点,但是尽管您可以指定一个与1对应的十六进制值,但在Java中不能将整数声明为unsigned。正如rlibby和Powers先生所演示的那样,实际的转换是微不足道的,因为对位的解释不同。但是,该方法在您可能要弄乱二进制数据的几种情况下可能很有用。有几种有用的非标准技巧,例如此处所述,它们依赖于利用浮点数的IEEE 754表示形式。也许在直线上的某个地方,当需要在位的整数表示和浮点表示之间进行转换时,可能会使用该方法。