2015-09-01 111 views
4

當使用IEEE 754浮點表示(double類型在C++),即非常接近號碼(表示的)整數被四捨五入爲與其最接近的整數和準確表示。真的嗎?
在四捨五入前,數字必須與最接近的可表示整數有多接近?
這個距離是不變的?
例如,假設1可以精確表示,最大的double小於1是多少?IEEE 754浮點,最大數目<1是多少?

回答

6

當使用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

+0

謝謝。我稍微編輯了這個問題,以減少我希望的誤導。 – user1971455

2

你會發現關於從1.0 相反方向1.0和一個較大數字之間的差別在這裏是更明確的說明:

std::numeric_limits<double>::epsilon()

的方式浮點工程,下一個較小的數應該與下一個更大的數字相距1.0的一半。

2

第一個低於1的IEEE雙精度值可以毫不含糊地寫爲0.99999999999999989,但確切地說是0.99999999999999988897769753748434595763683319091796875。

距離是而不是不變,它取決於數字的指數(因而數量級)。最終差距變得大於1,這意味着即使(不是奇數 - 奇數的整數是第一個被舍入的)相反,整數會變得有些圓整(或者最終很多)。

-2

當使用IEEE 754浮點表示法(C++中的double類型)時,非常接近精確整數的數字將四捨五入到最接近的整數並精確表示。真的嗎?

這是錯誤的。

在四捨五入前,數字到最近的整數究竟有多近?

當你做一個二進制字符串轉換浮點數被四捨五入到當前精度(爲printf家庭的默認精度爲6個功能)使用當前的舍入模式。

0

增加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/