回答
被以紅色突出顯示的公式可用於計算當作爲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;
}
編輯:作爲奧洛夫評論說,一個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/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 是完全可表示的。
十進制數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 不是完全可表示的。
該公式是將二進制表示轉換爲數字!
你只需要它,如果要實現一個浮點單元
- 1. 從IEEE 754雙倍位中竊取位
- 2. Java IEEE 64位754雙倍值,以避免
- 3. ,64位和80位浮點IEEE-754?
- 4. Ruby將64位IEEE 754十六進制轉換爲雙精度
- 5. IEEE 754和浮點精度
- 6. 有關IEEE 754單精度浮點數的問題
- 7. Java - 將十六進制轉換爲IEEE-754 64位浮點數 - 雙精度
- 8. 問題關於補和IEEE 754所表示
- 9. IEEE 754如何定義平等?
- 10. 我的IEEE 754浮點表示有什麼問題?
- 11. 什麼是IEEE-754?
- 12. Java轉換HEX到IEEE 754 32位值...?
- 13. IEEE 754中的指數
- 14. IEEE 754浮點表示法
- 15. IEEE 754:Java腳本對C
- 16. Infinity在IEEE 754中有哪些用例?
- 17. 在C++中將雙數轉換爲(IEEE 754)64位二進制字符串表示形式
- 18. 使用IEEE 754將浮點數轉換爲基數10使用IEEE 754
- 19. 從使用iEEE的字符數組恢復雙值754
- 20. 從MIPS C到Java轉換的IEEE 754雙精度數字
- 21. 是否有任何真實世界的CPU不使用IEEE 754?
- 22. IEEE-754浮點數舍入機制
- 23. IEEE 754舍入到正無窮大
- 24. 十六進制浮點數IEEE 754雙精度C++
- 25. Java浮點到IEEE-754十六進制?
- 26. IEEE 754 REAL Codesys的單精度
- 27. 關於Win7的問題64位
- 28. Selenium Webdriver _有關32位/ 64位服務器的問題
- 29. 在沒有FPU的MIPS彙編中將單精度(IEEE 754)分爲雙精度
- 30. 從IEEE-754轉換爲十進制
一個很好的答案! Stackoverflow中的許多人似乎都認爲浮點值是不精確的。這只是部分正確的:當用二進制空格表示數字時,它們完全絕對精確,如上例所示。正如示例所示,這是將小數空間映射到二進制文件時我們得到的不精確性。更準確地說,它試圖映射不精確的十進制值。也許,爲了進一步澄清,你可以展示一個確切的十進制值(如0.4)如何映射到二進制,並且我們有三種情況。 +1 – 2011-03-02 08:52:01
@Olof:感謝您的讚美和建議。我已經更新了我的答案。 – 2011-03-02 18:15:35