我的任务是将浮点数从其十进制转换为其32位二进制表示形式(IEEE 754.)

下面是我解决任务的尝试;它导致了同样的结果,一些在线转换工具也产生了我,但是我被告知我的解决方案不好,因为“它编码了错误的指数”。

我能否深入了解到底是哪个步骤导致了此问题(如果有),为什么我仍得到正确的(?)结果?

================================================== ================

浮点数(十进制表示形式)转换为:6.4

小数点前的二进制位置:

6/2 = 3 -> 0
3/2 = 1.5 -> 1
1/2 = 0.5 -> 1

=> 110


二进制的小数位:

0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1

=>  011001100110011001100110011001


正常化:

110,011001100110011001100110011001 * 2^0
1,10011001100110011001100110011001 * 2^2


特性:

2+127 = 129 (Exponent + Bias)

129 / 2 = 64.5 -> 1
64 / 2 = 32 -> 0
32 / 2 = 16 -> 0
16 / 2 = 8 -> 0
8 / 2 = 4 -> 0
4 / 2 = 2 -> 0
2 / 2 = 1 -> 0
1 / 2 = 0.5 -> 1

=> 10000001


符号:0(正)

结果:

01000000110011001100110011001101


可能导致相同问题的代码段:

public static void main(String[] args) {

    float input = IO.readFloat("Please enter a float!\n");
    String sign = input < 0 ? "1" : "0";
    if (input < 0) {
        input *= -1;
    } else if (input == 0) {
        IO.println("00000000000000000000000000000000");
        return;
    }

    float preDecimalPointPositions = input - (input % 1);
    String preDecimalPointPositionsBinary = "";
    while (preDecimalPointPositions >= 1 ) {
        if (preDecimalPointPositions % 2 == 0) {
            preDecimalPointPositionsBinary = "0" + preDecimalPointPositionsBinary;
        } else {
            preDecimalPointPositionsBinary = "1" + preDecimalPointPositionsBinary;
        }
        preDecimalPointPositions /= 2;
        preDecimalPointPositions = preDecimalPointPositions - (preDecimalPointPositions % 1); // Abschneiden der decimalPlacesstellen
    }

    float decimalPlaces = input % 1;
    String decimalPlacesBinary = ""; //
    for (int i = 0; i < 23; i++) { //
        decimalPlaces *= 2;
        if (decimalPlaces >= 1) {
            decimalPlacesBinary += "1";
            decimalPlaces -= 1;
        } else {
            decimalPlacesBinary += "0";
        }
    }

    int exponent;
    if (input < 1) {
        IO.println("Negative exponents ain't allowed here! =/");
        return;
    } else {
        exponent = preDecimalPointPositionsBinary.length() - 1;
    }
    String normalized = preDecimalPointPositionsBinary.substring(1) + decimalPlacesBinary;
    float characteristic = exponent + 127;
    String characteristicBinary = "";
    while (characteristic >= 1 ) {
        if (characteristic % 2 == 0) {
            characteristicBinary = "0" + characteristicBinary;
        } else {
            characteristicBinary = "1" + characteristicBinary;
        }
        characteristic /= 2;
        characteristic = characteristic - (characteristic % 1);
    }

    String result = sign + characteristicBinary + normalized.substring(0, 23);
    IO.println(result);
}

最佳答案

将小数位转换为二进制时,您的第8行说

0.2 * 2 = 0.4 -> 0


但是接着你继续

0.8 * 2 = 1.6 -> 1


代替

0.4 * 2 = 0.8 -> 0


第12、15、18、21和24行存在相同的问题

解决此问题后,应该给您正确的尾数(在归一化之后),给您正确的结果

01000000110011001100110011001101


您也可以通过this IEEE 754 converter查看

10-07 19:16
查看更多