3

查看名称和Boost Multiprecision 文档,我希望cpp_dec_float_50数据类型的精度为 50 位十进制数字:

使用 typedef cpp_dec_float_50 隐藏了多精度的复杂性,允许我们定义具有 50 位精度的变量,就像内置的 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 位数字 -它被记录为

返回格式化为字符串的数字,至少包含精度数字,如果科学为真,则返回科学格式。

4

1 回答 1

3

您所看到的可能与内部使用的保护数字有关。原因是即使是十进制表示也具有有限的准确性(想想(“100.0”/“3.0”)*“3.0”)。

为了在计算过程中得到合理的舍入误差,存储的精度会大于保证的精度。

总而言之:始终具体说明您的预期精度。在你的例子d.str(50)中会做。

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

于 2015-10-09T17:41:45.173 回答