使用Boost Multiprecision的小数位数舍入数字错误的问题

时间:2019-04-01 22:25:58

标签: boost-multiprecision

我正在为Qml Felgo App项目“ Galaxy Calculator”编写即将推出的github C ++, 使用字符串表示非常大的数字和小数, 不能用float,double或long double来准确表示, 我的目标是采用非常大的十进制字符串并将其舍入到指定的精度, 因此,请阅读增强文档:

提升:https://www.boost.org/doc/libs/1_69_0/libs/multiprecision/doc/html/boost_multiprecision/tut/floats/mpfr_float.html

“通过指定非零Digits10模板参数,可以以固定精度使用mpfr_float_backend类型,或者通过将模板参数设置为零,可以以可变精度使用类型。”

我用了这个:

 typedef boost::multiprecision::number<mpfr_float_backend<0> > my_mpfr_float;

将其设置为0应该允许我这样做:

 my_mpfr_float::default_precision(precision);

请记住,Precision是基于位数的总数而不是小数位的,如果我理解正确的概念,则它采用小数点左右的数字并将它们加在一起。需要一种设置小数位的方法,我只能找到Precision,所以我正在尝试使用它。

但是我总是得到16位精度,而不是我设置的精度。因此它返回的结果,就精度而言,只会将等式加1:

0.0072992700729928

这是代码:

 #include <boost/multiprecision/mpfr.hpp>
 #include <boost/multiprecision/gmp.hpp>
 #include <string>
 #include <sstream>

 QString round(const QString &mThis, const unsigned int &precision)
 {
     using namespace boost::multiprecision;
     typedef boost::multiprecision::number<mpfr_float_backend<0> > my_mpfr_float;
     my_mpfr_float::default_precision(precision);
     my_mpfr_float aThis(mThis.toStdString());
     qDebug() << "aThis=" + QString::fromStdString(aThis.str());
     return QString::fromStdString(aThis.str());
 }

// 1/137,尽管我可以将其定义为常量,但这只是一个示例,

//,但应与常量相同,但不相同。

 var ans = round("0.007299270072992700729927007299270072992700729927007299270073", 13);

我在进行数学运算时遇到同样的问题, 我决定尝试通过四舍五入来修复它, 所以这不是做数学的问题, 由于数学可以根据需要更改结果中的数字, 所以我从函数中消除了任何可以改变结果的数学运算, 并且仅使用QString,因为这是Qml JavaScript调用, 因此,通过将后端设置为0,将精度设置为特定数字, 转换应该在后端自动完成, 并将其转换回字符串不应改变它, 但这并没有按计划进行, 我找不到使用此库进行舍入的任何示例, 但我看不到更改精度之间的区别, 然后四舍五入,将精度设置为0会导致x.0变差, 但是13位数字应该是13而不是16,而3给我7和0给我4, 而0是我真正需要将其设为0的选项之一,这看起来像是Boost中的Bug, 否则就无法按我期望的方式工作, 我希望它将数字标准化为正确的数字。

请勿将此行为与将符号存储在多余字节中的浮点数或小数混淆,这不是问题所在。

我所说的规模的精确度以光年为单位, 因此只有小数点后一位可以表示英里,英尺或英寸,最小的测量范围, 所以当我需要一定数量的数字时,这对计算非常重要

更新:已提交的错误报告:https://github.com/boostorg/multiprecision/issues/127

感谢您的帮助。

0 个答案:

没有答案