float . intbitstoffloat是如何工作的?



谁能给我解释一下或链接一些有用的资源,以便理解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位,浮点数的大小也是32位,所以我们假设两者之间的转换不会产生意外的结果。您可能已经知道这一点,但是在Java中不能将整数声明为unsigned,尽管您可以指定一个对应于1的十六进制值。正如利比和鲍尔斯先生所演示的那样,实际的转换是微不足道的,因为比特的解释方式不同。但是,在您可能试图处理二进制数据的几个场景中,该方法可能很有用。有几个有用的非标准技巧,比如这里描述的那些,它们依赖于利用IEEE 754浮点数的表示;当需要在位的整数表示和浮点表示之间进行转换时,可能会在某个地方使用该方法。

相关内容

  • 没有找到相关文章

最新更新