0

我正在将一个 bash 脚本转换为一个名为 Galaxy Calculator 的 Qt Qml Felgo 应用程序,我需要计算 Galaxy 的周长,浮点数在计算中失败了 100 英里,使用 C++ 的 JavaScript,这些数字在很长一段时间内都很大双倍的。这是 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() 我传入字符串并返回一个字符串以避免使用浮点数,但我找不到另一种填充这种数据类型的方法,因为我没有想法如何传递一个字符串,我已经找了两天的例子,所以这是我的第一个问题,这可能导致我的第二个问题,这是我得到这个的返回值:

1011954108252979200.000000

当我预料到这一点时(bc 很棒:接受一个字符串,然后将其返回);

1011954093357316199.9999999999118107708

也许我有点挑剔,数字很接近,但那些多余的数字是以英里、英尺和英寸为单位的,这只是一个等式,这个错误会越多越累,这只是一个例子,有些计算比其他计算有更多的数学,所以我需要帮助来弄清楚如何传递一个字符串,以及如何返回一个具有该函数可以给我的所有准确度的字符串,我可以稍后将它舍入,一些我需要用于其他计算,所以我不希望它们超过 16,因为在那之后我们谈论的是一英寸的分数,我不需要那么高的精度,但我确实需要分数英里,英尺到最后一英寸。

我确实尝试过 mpfr_float,其他人也喜欢它,所以我想知道是不是我必须将它转换为一个浮点数,从而搞砸了它;所以我真的需要能够用字符串填充这个值,所以我不会失去任何精度。

我对该函数的输入在 bash 脚本中,我必须这样做 3 次才能得到答案,而且我不介意,过度使用 eval 来运行它,并且 PI 固定在那么多数字上,因为这就是我的堂兄多次删除了他所有计算中使用的艾萨克牛顿,所以我不能使用 PI。我可以使用任何有效的数据类型,如果您知道显示如何执行此操作的文档,请包含它们,boost 的链接很可能是我已经阅读过的链接,自从它首次出现以来一直是 boost 用户,我第一次使用这个库,但是他们所有的例子都是一样的,他们的文档非常临床,不是很糟糕,你知道我的意思,它读起来就像是电脑写的,并用一页作为模板下一个,所以一段时间后,所有文档看起来都一样,我握了很长时间,

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

4

1 回答 1

1

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

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
于 2019-03-29T03:21:09.920 回答