cpp_dec_foat_50的精度是多少



查看名称和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)就可以了。

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

相关内容

  • 没有找到相关文章

最新更新