我的任务是将浮点数从其十进制转换为其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查看