numeric_limits :: digits10的确切含义是什么? stackoverflow中的一些其他相关问题使我认为它是double的最大精度,但是
这是原型:
#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 :(得分:16)
numeric_limits::digits10
是可以保持不丢失的小数位数。
例如numeric_limits<unsigned char>::digits10
是2.这意味着unsigned char可以保持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
答案 1 :(得分:7)
numeric_limits :: digits10指定您可以表示的小数点左侧的小数位数,而不会丢失精度。每种类型都有不同数量的可表示的十进制值。
答案 2 :(得分:6)
'53'是你的类型(double)所持有的significand的位宽。 '15'是十进制位数,可以用这种精度用安全表示。
答案 3 :(得分: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)时串起形式并显示不同的字符串。 使用16位或更少的数字,您可以得到代码不相等的双精度数, 但是当它们转换成字符串形式时它们是相同的 (这将给出在代码中进行比较时它们不同的情况, 但是日志文件会将它们显示为相同 - 非常混乱且难以调试!)
当您比较值时(例如通过差异两个日志文件手动查看它们),我们应该记住数字1-15始终有效,但第16和第17位 MAY 的差异是垃圾。
答案 4 :(得分:2)
digits10
用于转换:字符串→双→字符串
max_digits10
用于转换:double→string→double
在你的程序中,你正在使用转换(double→string→double)。您应该使用max_digits10
代替digits10
。
有关digits10
和max_digits10
的详细信息,请参阅: