當使用IEEE 754浮點表示(double
類型在C++),即非常接近號碼(表示的)整數被四捨五入爲與其最接近的整數和準確表示。真的嗎?
在四捨五入前,數字必須與最接近的可表示整數有多接近?
這個距離是不變的?
例如,假設1可以精確表示,最大的double
小於1是多少?IEEE 754浮點,最大數目<1是多少?
回答
當使用IEEE 754浮點表示(
double
類型在 C++),即非常接近號碼(表示的)整數 四捨五入爲與其最接近的整數和準確表示。
這取決於數字是否接近整數而不是其他值可表示。 0.99999999999999994
is not equal to 1
, but 0.99999999999999995
is.
這個距離是不變的?
不,它變得越來越小 - 特別是在表示中指數更大時。較大的指數意味着尾數涵蓋的間隔較大,這意味着總體精度較低。
例如,什麼是最大的雙小於1?
std::nexttoward(1.0, 0.0)
。例如。 0.999999999999999889
on Coliru。
你會發現關於從1.0 相反方向1.0和一個較大數字之間的差別在這裏是更明確的說明:
std::numeric_limits<double>::epsilon()
的方式浮點工程,下一個較小的數應該與下一個更大的數字相距1.0的一半。
第一個低於1的IEEE雙精度值可以毫不含糊地寫爲0.99999999999999989,但確切地說是0.99999999999999988897769753748434595763683319091796875。
距離是而不是不變,它取決於數字的指數(因而數量級)。最終差距變得大於1,這意味着即使(不是奇數 - 奇數的整數是第一個被舍入的)相反,整數會變得有些圓整(或者最終很多)。
當使用IEEE 754浮點表示法(C++中的double類型)時,非常接近精確整數的數字將四捨五入到最接近的整數並精確表示。真的嗎?
這是錯誤的。
在四捨五入前,數字到最近的整數究竟有多近?
當你做一個二進制字符串轉換浮點數被四捨五入到當前精度(爲printf
家庭的默認精度爲6個功能)使用當前的舍入模式。
增加IEEE浮點數的二進制表示可以被看作是一個遞增的整數表示:
樣品哈克(英特爾):
#include <cstdint>
#include <iostream>
#include <limits>
int main() {
double one = 1;
std::uint64_t one_representation = *reinterpret_cast<std::uint64_t*>(&one);
std::uint64_t lesser_representation = one_representation - 1;
std::cout.precision(std::numeric_limits<double>::digits10 + 1);
std::cout << std::hex;
std::cout << *reinterpret_cast<double*>(&lesser_representation)
<< " [" << lesser_representation
<< "] < " << *reinterpret_cast<double*>(&one_representation)
<< " [" << one_representation
<< "]\n";
}
輸出:
0.9999999999999999 [3fefffffffffffff] < 1 [3ff0000000000000]
前進當如果指數位發生變化,則連續浮點數的差值將增加。
另請參閱:http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/
- 1. IEEE 754和浮點精度
- 2. IEEE 754浮點表示法
- 3. IEEE-754單精度浮點數mips
- 4. IEEE-754浮點數舍入機制
- 5. 使用IEEE 754將浮點數轉換爲基數10使用IEEE 754
- 6. 754在IEEE 754浮點數中意味着什麼?
- 7. IEEE 24位浮點數的最小正值是多少?
- 8. Java浮點到IEEE-754十六進制?
- 9. ,64位和80位浮點IEEE-754?
- 10. IEEE 754的浮點舍入到最接近
- 11. 什麼是IEEE-754?
- 12. 如何輸出IEEE-754格式的整數作爲浮點數
- 13. IEEE 754浮點數調試 - 從內存小端實際浮點數
- 14. IEEE浮點數
- 15. 什麼是單精度32位IEEE 754浮點?
- 16. 在MIPS中乘以兩個IEEE 754浮點數
- 17. 將pre-IEEE-754 C++浮點數轉換爲C#中的
- 18. 單精度IEEE 754浮點數的格式化
- 19. 轉換IEEE 754浮點數與C詛咒 - printf的
- 20. 將二進制32位IEEE-754浮點數轉換爲.net
- 21. 將十六進制字符串轉換爲IEEE 754浮點數
- 22. 轉換IEEE 754浮點數以十六進制字符串
- 23. 有關IEEE 754單精度浮點數的問題
- 24. 如何將手動IEEE 754輸入到浮點數?
- 25. 在C#中將十六進制轉換爲IEEE 754浮點數
- 26. 如何浮點數轉換爲IEEE 754使用匯編
- 27. 十六進制浮點數IEEE 754雙精度C++
- 28. IEEE-754浮點:爲了獲得最佳精度,先分開還是先乘以?
- 29. Java浮點數的尾數部分的最大數是多少?
- 30. 最小浮點數X s.t. 1/X不是無窮大
謝謝。我稍微編輯了這個問題,以減少我希望的誤導。 – user1971455