查看名称和Boost Multiprecision文档,我预计cpp_dec_float_50
数据类型的精度为50位小数位数:
使用typedef cpp_dec_foat_50隐藏了多精度的复杂性,使我们能够像内置的双精度一样定义精度为50位小数的变量。
(虽然我不理解与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位数字-记录为:
返回格式化为字符串的数字,至少包含精确数字,如果scientific为true,则返回科学格式的数字。
您所看到的可能与内部使用的保护数字有关。原因是即使是十进制表示也有有限的准确性(想想("100.0"/"3.0"(*"3.0">
为了在计算过程中获得合理的舍入误差,存储的精度将超过保证的精度。
总之:一定要明确你的预期精度。在你的例子中,d.str(50)
就可以了。
(在现实场景中,你应该想跟踪输入的精度,并推断输出的精度。大多数情况下,人们只是保留多余的精度,只打印他们感兴趣的部分(