max_digits10的目的是什么?它与digits10的不同之处是什么?

时间:2014-03-17 15:24:31

标签: c++ c++11 precision floating-point-precision numeric-limits

我对max_digits10所代表的内容感到困惑。根据{{​​3}},对于所有整数类型,它为0。 max_digits10的浮点类型公式与int的{​​{1}}类似。

2 个答案:

答案 0 :(得分:24)

简单来说,

  • digits10是保证文本存活的十进制数字→浮动→文本往返。
  • max_digits10是保证正确浮动→文本→浮动往返所需的小数位数。

两者都有例外,但这些值给出了最低限度的保证。阅读max_digits10上的original proposal,以获得一个明确的例子,W。Kahan教授的话和进一步的细节。大多数C ++实现都遵循IEEE 754的浮点数据类型。对于IEEE 754 floatdigits106max_digits109;对于double1517。请注意,这两个数字should not be confused都具有浮点数的实际小数精度。

示例digits10

char const *s1 = "8.589973e9";
char const *s2 = "0.100000001490116119384765625";
float const f1 = strtof(s1, nullptr);
float const f2 = strtof(s2, nullptr);
std::cout << "'" << s1 << "'" << '\t' << std::scientific << f1 << '\n';
std::cout << "'" << s2 << "'" << '\t' << std::fixed << std::setprecision(27) << f2 << '\n';

打印

'8.589973e9'      8.589974e+009
'0.100000001490116119384765625'   0.100000001490116119384765625

保留了6个 th 有效数字的所有数字,而第7个 th 数字没有为第一个数字存活。然而,第二个的所有27位数幸存了下来; this是一个例外。但是,大多数数字在7位数之后变得不同,并且所有数字在6位数内都是相同的。

总之,digits10给出了您在给定float中可以指望的有效位数,与创建它的十进制形式的原始实数相同,即数字转换为float后幸存下来。

示例max_digits10

void f_s_f(float &f, int p) {
    std::ostringstream oss;
    oss << std::fixed << std::setprecision(p) << f;
    f = strtof(oss.str().c_str(), nullptr);
}

float f3 = 3.145900f;
float f4 = std::nextafter(f3, 3.2f);
std::cout << std::hexfloat << std::showbase << f3 << '\t' << f4 << '\n';
f_s_f(f3, std::numeric_limits<float>::max_digits10);
f_s_f(f4, std::numeric_limits<float>::max_digits10);
std::cout << f3 << '\t' << f4 << '\n';
f_s_f(f3, 6);
f_s_f(f4, 6);
std::cout << f3 << '\t' << f4 << '\n';

打印

0x1.92acdap+1   0x1.92acdcp+1
0x1.92acdap+1   0x1.92acdcp+1
0x1.92acdap+1   0x1.92acdap+1

这里有两个不同的float,当用max_digits10精度数字打印时,它们会给出不同的字符串,这些字符串在读回时会返回它们来自的原始float。当以较低的精度打印时,由于四舍五入,它们会提供相同的输出,因此当读回时导致相同的float,而实际上它们来自不同的值。

总之,max_digits10至少需要消除十进制形式的两个浮点数的歧义,这样当转换回二进制浮点数时,我们再次得到原始位,而不是它之前或之后的原始位。由于舍入误差。

答案 1 :(得分:2)

在我看来,它在链接网站(以及数字10的网站)上得到充分解释:

digits10是(最大)数量的“十进制”数字,其中数字为 在任何情况下都可以用一种类型表示,与它们的实际值无关 一个通常的4字节无符号整数例如:每个人都应该知道,它正好是32位,
这是二进制数的32位数 但就十进制数而言?
可能是9.
因为,它可以存储1亿和999999999 但是如果采用10位数字:可以存储4000000000,但不能存储5000000000 因此,如果我们需要最小十进制数字容量的保证,那么它是9 这就是数字10的结果。

max_digits10仅对float / double ...感兴趣,并给出十进制数字数 我们需要输出/保存/处理......以获得整体精度 浮点类型可以提供 理论示例:内容为123.112233445566的变量 如果您向用户显示123.11223344,则不尽可能精确 如果您向用户显示123.1122334455660000000,则没有任何意义,因为
你可以省略尾随的零(因为你的变量无论如何都不能保持那么多) 因此,max_digits10表示您在一个类型中可用的精度位数。