我的任務是浮法從其十進制轉換成其32位的二進制表示(IEEE 754)不正確指數(?)從十進制表示轉換浮子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);
}
如果您想驗證它使用HTTPS進行比較檢查:// docs.oracle.com/javase/7/docs/api/java/lang/Float.html#floatToRawIntBits(float) –
哪種在線轉換工具? FWIW,我從Python獲得'01000000110011001100110011001101'('python -c「import struct; print(format(struct.unpack('
我向OP添加了代碼。我編寫的例子包含了一個錯誤,當我在「雙精度小數位」部分中複製和粘貼重複行時引入了錯誤(我真的很抱歉)!現在應該導致您提供的結果。根據我的老師的說法,雖然指數是錯誤的,但是第二位是1並不符合他所說的。 – Max