numeric_limits <double> :: digits10是什么意思?

sth*_*ers 15 c++ stl

numeric_limits :: digits10的确切含义是什么?stackoverflow中的一些其他相关问题使我认为它是double的最大精度,但是

  • 当精度大于17(== 2 + numeric_limits :: digits10)时,以下原型开始工作(成功为真)
  • 使用STLPort,最后是readDouble == infinity; 使用microsoft的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;
}
Run Code Online (Sandbox Code Playgroud)

And*_*ein 17

numeric_limits::digits10 是可以保持不丢失的小数位数.

例如numeric_limits<unsigned char>::digits10是2.这意味着unsigned char可以保持0..99而不会丢失.如果它是3它可以保持0..999,但是我们都知道它只能保持0..255.

本手册页有一个浮点数的例子,(缩短时)表示

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

版画

6
The float is; 100000000
Run Code Online (Sandbox Code Playgroud)


Aar*_*ela 7

numeric_limits :: digits10指定您可以表示的小数点左侧的小数位数,而不会丢失精度.每种类型都有不同数量的可表示的十进制值.


Dev*_*lar 6

'53'是您的类型(double)所包含的有效数字的位宽.'15'是可以用这种精度安全表示的小数位数.


War*_*ens 6

请参阅这篇非常易读的文章:http: //www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2005.pdf

虽然DBL_MAX(= std :: numeric_limits :: digits10 = 15位)是double的最小保证位数,但本文中提出的DBL_MAXDIG10值(= 17位)具有以下有用属性:

  • 这是生成往返字符串形式所需的最小位数,然后返回并获得相同的双精度数.

  • 是每次在代码中获得(A!= B)时将double转换为字符串形式并显示不同字符串所需的最小位数.使用16位或更少的数字,您可以获得在代码中不相等的双精度数,但是当它们转换为字符串形式时它们是相同的(这将给出在代码中进行比较时它们不同的情况,但是日志文件将将它们显示为相同 - 非常混乱且难以调试!)

当你比较值时(例如通过差异化两个日志文件手动查看它们),我们应该记住数字1-15始终有效,但第16和第17位的差异可能是垃圾.