2009-04-14 133 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更多的细节,你可以阅读: