使用Boost多重精度的Math Precision问题

时间:2019-03-29 02:14:08

标签: c++ qt qt5 boost-multiprecision

我正在将bash脚本转换为名为Galaxy Calculator的Qt Qml Felgo应用,并且我需要使用C ++ JavaScript计算出Galaxy的周长,而浮点计算失败了100英里。长一双。这是bash行

echo "$(bc <<< "scale=13;((241828072282107.5071453596951 * 666) * 2) * 3.14159265359")"

我对此进行了解释,所以您将了解数字,并且我不想辩论数学,它是物理学博士学位的一部分,它描述了这种数学,但是您可以检查结果以对该数字进行任何估计,但是这不是我的问题的一部分,只是试图解释我正在执行的哪种类型的计算需要非常高的准确性。在Galaxy中计算距离时,它将是一个很大的数字,我需要帮助的是将两个数字相乘得到正确的输出,这是我的功能:

 QString MathWizard::multiply(const QString &mThis, const QString &mThat)
 {
     using namespace boost::multiprecision;

     cpp_dec_float_100 aThis = mThis.toFloat();
     cpp_dec_float_100 aThat = mThat.toFloat();
     cpp_dec_float_100 ans = (aThis * aThat);

     std::stringstream ss;
     ss.imbue(std::locale(""));
     ss << std::fixed << std::setprecision(16) << ans;

     return QString::fromStdString(ss.str());
 }

只看代码,大多数程序员都会注意到我的第一个错误:toFloat() 我传入了字符串并返回了一个字符串,以避免不得不使用Float,但是我找不到另一种填充该数据类型的方法,因为我不知道如何传入一个字符串,我已经找了两天了。例如,这是我的第一个问题,可能是导致我的第二个问题,即我正在获得此问题的返回值:

1011954108252979200.000000

当我期望这一点时(bc很棒:获取一个字符串,并将其返回);

1011954093357316199.9999999999118107708

也许我有点挑剔,这个数字非常接近,但是那些多余的数字是以英里,英尺和英寸为单位的,这只是一个等式,这个错误将加起来更多,这仅仅是一个例子,有些计算比其他计算更多,因此我需要帮助找出如何传递字符串,以及如何以该函数可以提供的所有精度返回字符串,我可以稍后进行舍入,有些我需要对于其他计算,我不希望它们的圆度超过16,因为在那之后我们谈论的是英寸的分数,我不需要那么多的精度,但是我确实需要小数英里,直到最后一英寸。

我确实尝试过mpfr_float以及其他类似的工具,所以我想知道是否是我必须将其转换为float的事实?因此,我确实需要能够用字符串填充此值,因此我不会损失任何精度。

此函数的输入是在bash脚本中,我必须执行3次才能得到答案,而且我不介意使用eval来运行它,并且PI固定为那么多数字,因为这就是我的第一堂兄弟多次删除Isaac Newton在其所有计算中使用的内容,因此我无法使用PI。我可以使用任何有效的数据类型,如果您知道显示该操作方法的文档,请包括在内,指向boost的链接很可能是我已经阅读过的链接,因为它刚出现时就成为了boost用户,第一次使用该库,但是它们的所有示例都是相同的,并且它们的文档都非常具有临床意义,而且效果不错,您知道我的意思,它读起来就像是计算机编写的,并使用一页作为模板接下来,因此所有文档在一段时间后看起来都一样,我的时间很长,我喜欢每个功能的许多示例,以及实际使用中的示例,但我没有发现任何可增强功能的文档像这样,请点击此链接以了解如果您认为我在夸大其词或在乱中(Ranting)的意思:

提升:https://www.boost.org/doc/libs/1_68_0/libs/multiprecision/doc/html/index.html

1 个答案:

答案 0 :(得分:1)

由于cpp_dec_float_100接受std::string,因此您不必将QString转换为float;

QString MathWizard::multiply(const QString &mThis, const QString &mThat){
    using namespace boost::multiprecision;
    cpp_dec_float_100 aThis(mThis.toStdString());
    cpp_dec_float_100 aThat(mThat.toStdString());
    cpp_dec_float_100 ans = (aThis * aThat);
    return QString::fromStdString(ans.str());
}

输出:

1011954093357316199.999999999911810770784788