2016-11-15 60 views
1

我的任務是浮法從其十進制轉換成其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); 
} 
+1

如果您想驗證它使用HTTPS進行比較檢查:// docs.oracle.com/javase/7/docs/api/java/lang/Float.html#floatToRawIntBits(float) –

+0

哪種在線轉換工具? FWIW,我從Python獲得'01000000110011001100110011001101'('python -c「import struct; print(format(struct.unpack('

+0

我向OP添加了代碼。我編寫的例子包含了一個錯誤,當我在「雙精度小數位」部分中複製和粘貼重複行時引入了錯誤(我真的很抱歉)!現在應該導致您提供的結果。根據我的老師的說法,雖然指數是錯誤的,但是第二位是1並不符合他所說的。 – Max

回答

1

當轉換小數爲二進制的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

+0

對不起,編寫這個例子時發生了錯誤。我現在將它固定在我的OP中。儘管如此,我使用的整個過程導致了一個不正確的指數,根據我的指導員說的。我將向OP中添加一些代碼,這些代碼也會錯誤地對指數進行編碼。 – Max

+1

@Max我現在無法嘗試代碼,但如果它提供了您現在糾正的解決方案,那應該沒問題。我不知道你的老師爲什麼會說第一個'*'沒有意義*。他解釋了爲什麼?他是否知道偏見是如何工作的? :D據我所知,我會說他是錯的,你應該要求他正確地解釋他爲什麼認爲**正確**解決方案是錯誤的。 – Keiwan