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