Float.intBitsToFloat如何工作?

时间:2011-04-13 06:48:48

标签: java binary floating-point

任何人都可以解释我或链接一些有用的资源,以了解Java方法Float.intBitsToFloat(int)背后的算法吗?

3 个答案:

答案 0 :(得分:7)

Java使用IEEE 754浮点。 Float.intBitsToFloat(int)通过解释其参数的32位来工作,就好像它们以described here格式指定了32位浮点数。

对于64位浮点数as described here

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表示;也许在某个地方,当需要在整数和浮点表示位之间进行转换时,该方法可能会被使用。