cpp_dec_float_50的精度是多少?

3

看到名称和Boost Multiprecision documentation,我期望cpp_dec_float_50数据类型的精度为50个小数位:

使用typedef cpp_dec_float_50隐藏多精度的复杂性,使我们能够定义具有50个小数位精度的变量,就像内置的double一样。

(虽然我不理解与double的比较-我的意思是double通常实现二进制浮点算术,而不是十进制浮点算术。)

这也与以下代码的输出相匹配(除了double部分,但这是预期的):

cout << std::numeric_limits<boost::multiprecision::cpp_dec_float_50>::digits10
  << '\n';
// -> 50
cout << std::numeric_limits<double>::digits10 << '\n';
// -> 15

但是为什么下面的代码会打印出74个数字呢?
#include <boost/multiprecision/cpp_dec_float.hpp>

// "12" repeated 50 times, decimal point after the 10th digit
boost::multiprecision::cpp_dec_float_50 d("1212121212.121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212");
cout << d.convert_to<string>() << '\n';
// Expected output: 50 digits
// Actual output: 74 digits
// -> 1212121212.1212121212121212121212121212121212121212121212121212121212121212

str()成员函数按预期工作,例如。

cout << d.str(50) << '\n';

只打印50位数字 - 其中它被记录为:

返回格式化为字符串的数字,至少精确到precision位,并且如果scientific为true,则以科学计数法表示。

1个回答

3
你所看到的可能与内部使用的守卫位有关。原因是即使是十进制表示也具有有限的精度(想一想(“100.0” / “3.0”)*“3.0”)。
为了在计算过程中获得合理的舍入误差,存储的精度将超过保证的精度。
总之:始终要明确你期望的精度。在你的例子中,d.str(50)就可以了。

(在现实场景中,您应该想要跟踪输入的精度并推断输出的精度。大多数情况下,人们只保留多余的精度并仅打印他们感兴趣的部分)


顺便问一下,你能为那个引用添加一个参考文献吗? - maxschlepzig
@maxschlepzig 我自己说的。本来应该是一个“旁注”内容。我指的逻辑是带有明确误差范围的科学测量。 - sehe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接