[英]IEEE 754 floating point, what is the largest number < 1?
當使用IEEE 754浮點表示(c ++中的double
類型)時,非常接近(可表示)整數的數字將四舍五入到它們最接近的整數並精確表示。 真的嗎?
在舍入之前,數字究竟與最接近的可表示整數有多接近?
這個距離是否恆定?
例如,假設1可以精確表示,那么最大的double
小於1是多少?
當使用IEEE 754浮點表示(c ++中的
double
類型)時,非常接近(可表示)整數的數字將四舍五入到它們最接近的整數並精確表示。
這取決於數字是否更接近整數而不是其他可表示的值。 0.99999999999999994
不等於1
,但是0.99999999999999995
是。
這個距離是否恆定?
不,它在更大的范圍內變得更小 - 特別是在表示中具有更大的指數。 較大的指數意味着尾數覆蓋較大的間隔,這反過來意味着整體精度較低。
例如,最小的雙倍小於1是多少?
std::nexttoward(1.0, 0.0)
。 例如, 在Coliru的0.999999999999999889
。
你會發現更多關於1.0的相反方向的明確陳述1.0和下一個更大的數字之間的差異記錄在這里:
std::numeric_limits<double>::epsilon()
浮點的工作方式,下一個較小的數字應該與下一個較大的數字正好相差一半。
低於1的第一個IEEE雙精度數可以明確地寫為0.99999999999999989,但正好是0.99999999999999988897769753748434595763683319091796875。
距離不是恆定的,它取決於數字的指數(以及數量)。 最終差距變得大於1,意味着偶數(不是奇數 - 奇數整數是第一個得到舍入的)整數將有點圓(或者,最終,很多)。
增加IEEE浮點數的二進制表示可以看作是遞增的整數表示:
示例Hack(英特爾):
#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/
當使用IEEE 754浮點表示(c ++中的雙精度類型)時,非常接近精確整數的數字將四舍五入為最接近的整數並精確表示。 真的嗎?
這是錯誤的。
在舍入之前,數字到底是多么接近最接近的int?
當您執行二進制到字符串轉換時,使用當前舍入模式將浮點數舍入為當前精度(對於printf
系列函數,默認精度為6)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.