2011-02-25 45 views
3

請看看以下內容:有關IEEE 754 64位雙倍的問題?

enter image description here

我知道如何雙轉換爲基於IEEE 754二進制,但我不明白什麼公式用於。

任何人都可以給我一個例子,當我們使用上述公式,請?

非常感謝。

回答

7

被以紅色突出顯示的公式可用於計算當作爲IEEE 754雙處理過的64位值表示real number。如果您想手動計算二進制到它所代表的基數爲10的實數的轉換,例如在驗證C庫的實現printf的正確性時,它纔有用。

例如,使用上0x3fd5555555555555式中,X被發現是恰好0.333333333333333314829616256247390992939472198486328125。這是0x3fd5555555555555表示的實數。

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    union { 
    double d; 
    unsigned long long ull; 
    } u; 

    u.ull = 0x3fd5555555555555L; 
    printf("%.55f\n", u.d); 

    return EXIT_SUCCESS; 
} 

http://codepad.org/kSithgZQ

編輯:作爲奧洛夫評論說,一個IEEE 754雙正是代表公式中的價值X,但不是所有的實數都準確地表示。事實上,只有實數如0.5,0.125,和0.333333333333333314829616256247390992939472198486328125 有限數目是精確表示,而絕大多數(uncountably many),包括1/3,0.1,0.4,和π

的關鍵知道真正的是否是完全-表示的作爲一個IEEE 754雙是計算實數的二進制表示,並將其寫入在scientific notation(例如B1.001×2 -1爲0.5625)。如果小數點右邊不包括尾部零的二進制數字的數目小於或等於52,指數減1表示-1022到+1023(含),則的數字是,可精確表示。

讓我們通過幾個例子。請注意,它有助於擁有一個任意精度的計算器。我將使用ARIBAS

  1. 1/64的數字是十進制的0.015625。計算其二進制表示,我們可以使用ARIBAS」 decode_float功能:

     
    ==> set_floatprec(double_float). 
    -: 64 
    
    ==> 1/64. 
    -: 0.0156250000000000000 
    
    ==> set_printbase(2). 
    -: 0y10 
    
    ==> decode_float(1/64). 
    -: (0y10000000_00000000_00000000_00000000_00000000_00000000_00000000_00000000, 
    -0y1000101) 
    
    ==> set_printbase(10). 
    -: 10 
    
    ==> -0y1000101. 
    -: -69 
    

    因此1/64 = b0.000001,或在科學記數法B1.0×2 -6

    1/64 完全可表示的。

  2. 十進制數1/10 = 0.1。計算其二進制表示:

     
    ==> set_printbase(2). 
    -: 0y10 
    
    ==> decode_float(1/10). 
    -: (0y11001100_11001100_11001100_11001100_11001100_11001100_11001100_11001100, 
    -0y1000011) 
    
    ==> set_printbase(10). 
    -: 10 
    
    ==> -0y1000011. 
    -: -67 
    

    所以1/10 = 0.1 = b0.000 (其中粗體表示重複位序列),或b1.100 ×2 -4以科學計數法。

    1/10 不是完全可表示的。

+2

一個很好的答案! Stackoverflow中的許多人似乎都認爲浮點值是不精確的。這只是部分正確的:當用二進制空格表示數字時,它們完全絕對精確,如上例所示。正如示例所示,這是將小數空間映射到二進制文件時我們得到的不精確性。更準確地說,它試圖映射不精確的十進制值。也許,爲了進一步澄清,你可以展示一個確切的十進制值(如0.4)如何映射到二進制,並且我們有三種情況。 +1 – 2011-03-02 08:52:01

+0

@Olof:感謝您的讚美和建議。我已經更新了我的答案。 – 2011-03-02 18:15:35

2

該公式是將二進制表示轉換爲數字!

你只需要它,如果要實現一個浮點單元