2009-04-14 131 views
14

numeric_limits :: digit10的精確含義是什麼? 計算器中的其他一些相關的問題,讓我覺得這是一個雙重的最大精度,但numeric_limits <double> :: digits10是什麼意思

  • 以下原型開始工作(sucess爲true)時,精度大於17(= = 2 + numeric_limits :: digits10)
  • 使用STLPort,readDouble == infinity結束;與微軟的STL,readDouble == 0.0。
  • 這個原型有什麼樣的意思:)?

這裏是原型:

#include <float.h> 
#include <limits> 
#include <math.h> 
#include <iostream> 
#include <iomanip> 
#include <sstream> 
#include <string> 
int main(int argc, const char* argv[]) { 
    std::ostringstream os; 
    //int digit10=std::numeric_limits<double>::digits10; // ==15 
    //int digit=std::numeric_limits<double>::digits; // ==53 
    os << std::setprecision(17); 
    os << DBL_MAX; 
    std::cout << os.str(); 
    std::stringbuf sb(os.str()); 
    std::istream is(&sb); 
    double readDouble=0.0; 
    is >> readDouble; 
    bool success = fabs(DBL_MAX-readDouble)<0.1; 
} 
+0

相關:[花車分數精確度(HTTP:/ /stackoverflow.com/questions/3310276/decimal-precision-of-floats)和[是6還是7.22?](ht TP://stackoverflow.com/q/30688422/183120)。 – legends2k 2015-08-25 07:39:12

回答

8

numeric_limits :: digits10指定小數點可以不用精度的損失表示的左側的小數位數。每種類型都有不同數量的可表示的十進制值。

+0

如果在小數點之前沒有除0之外的數字,那麼這並不意味着數字可以保留十進制後的十五位數? – Guillaume07 2012-10-29 14:16:06

+0

這個答案是不正確的。請參閱[這裏](http://stackoverflow.com/a/13103444/183120)。 – legends2k 2015-08-25 02:17:25

6

'53'是你的類型(雙)持有的significand的位寬。 '15'是十進制數字,可以用這種精度安全地表示

14

numeric_limits::digits10是可以保持不丟失的小數位數。

例如numeric_limits<unsigned char>::digits10是2.這意味着無符號字符可以保持0..99而不會丟失。 如果它是3它可以容納0..999,但正如我們都知道它只能容納0..255。

This manual page具有用於浮點數,其(縮短時)示出了

cout << numeric_limits<float>::digits10 <<endl; 
float f = (float)99999999; // 8 digits 
cout.precision (10); 
cout << "The float is; " << f << endl; 

打印

6 
The float is; 100000000 
+0

爲什麼在float示例中有8位數字而不是7位,因爲它可能足以顯示問題?這背後還有另一個原因嗎? – Guillaume07 2013-12-27 17:08:27

+1

@ Guillaume07據我所知,所有7位數字*整數*在完整的「double-> float-> double」轉換後仍然存在。失敗的最小整數是16777217,即8位數字。解釋爲什麼numeric_limits :: digits10是6可以在這裏找到http://stackoverflow.com/questions/3310276/decimal-precision-of-floats – 2014-03-03 18:31:53

6

看這個非常可讀紙的例子: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2005.pdf

雖然DBL_MAX( = std :: numeric_limits :: digits10 = 15位數字)是雙倍數字的最小保證位數即,在本文提出的DBL_MAXDIG10值(= 17位)具有有用的性能:

  • 是的生存一個往返串形式所需的最小位數和背面並獲得相同的雙到底。

  • 是將雙重 轉換爲字符串形式所需的最小位數,並且每次在代碼中獲得(A!= B)時顯示不同的字符串。 有16位或更少的數字,你可以得到在代碼 中不相等的雙數,但是當它們被轉換成字符串形式時,它們是相同的 (這將給出它們在代碼中相比不同的情況, 但是一個日誌文件將顯示它們相同 - 非常混亂,難以調試!)

當您diff'ing兩個日誌文件比較值(例如,通過手動審查他們)我們應該記住,數字1-15總是有效的,但在第16和第17位MAY差異是垃圾。

2

digits10是轉換:字符串→雙→字符串
max_digits10是轉換:雙→字符串→雙

在你的程序中,您使用的是轉換(雙→字符串→雙)。您應該使用max_digits10而不是digits10


有關digits10max_digits10更多的細節,你可以閱讀: