Как работает Float.intBitsToFloat? - PullRequest
4 голосов
/ 13 апреля 2011

Может кто-нибудь объяснить мне или связать какой-нибудь полезный ресурс, чтобы понять алгоритм, лежащий в основе метода Java Float.intBitsToFloat(int)?

Ответы [ 3 ]

7 голосов
/ 13 апреля 2011

Java использует IEEE 754 с плавающей запятой.Float.intBitsToFloat(int) работает, интерпретируя 32-битные аргументы, как если бы они указали 32-битное значение с плавающей запятой в формате , описанном здесь .

Double.longBitsToDouble(long) работает аналогично для 64-разрядных чисел с плавающей запятой , как описано здесь .

В C вы можете достичь того же эффекта, как это:1013 * (Хотя технически это было бы неопределенным поведением, на самом деле оно практически всегда работает как положено.)

5 голосов
/ 13 апреля 2011

Документы 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;
}    
2 голосов
/ 13 апреля 2011

На подавляющем большинстве современных платформ по умолчанию размер целого числа на процессорах составляет 32 бита, так же как и размер числа с плавающей запятой, поэтому мы предположим, что преобразование между этими двумя не дает неожиданных результатов.Вы, вероятно, уже знаете это, но целые числа не могут быть объявлены как беззнаковые в Java, хотя вы можете указать шестнадцатеричное значение, соответствующее одному.Фактическое преобразование, как продемонстрировали rlibby и Mr. Powers, тривиально, поскольку биты просто интерпретируются по-разному.Однако этот метод может быть полезен в нескольких сценариях, когда вы можете пытаться возиться с двоичными данными.Существует несколько полезных нестандартных приемов, таких как описанные здесь , которые основаны на использовании представления IEEE 754 для числа с плавающей запятой;возможно, где-то вдоль линии, метод может вступить в действие, когда возникает необходимость преобразования между целочисленным представлением и представлением битов с плавающей точкой.

...