Проблемы с Math Precision при использовании повышенной точности - PullRequest
0 голосов
/ 29 марта 2019

Я конвертирую bash-скрипт в приложение Qt Qml Felgo под названием Galaxy Calculator, и мне нужно вычислить окружность Галактики. С плавающей запятой при вычислении не удалось на 100 миль, используя JavaScript C ++, числа очень большие для длинного двойника. Это линия bash

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

Я объясняю это, чтобы вы поняли число, и я не хочу обсуждать математику, она является частью PhD по физике, которая описывает эту математику, но вы можете проверить результаты для любой оценки этого числа, но это не часть моего вопроса, я просто пытаюсь объяснить, какой тип вычислений, которые я делаю, требует такой точности. При расчете расстояния в Галактике это будет большое число, все, что мне нужно, это получить правильный результат умножения двух чисел, вот моя функция:

 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 фиксируется на таком количестве цифр, потому что это то, что мой двоюродный брат много раз удалял, Исаак Ньютон использовал во всех своих расчетах, поэтому я не могу использовать PI. Я могу использовать любой тип данных, который работает, и если вы знаете документы, которые показывают, как это сделать, пожалуйста, включите их, ссылки на повышение, скорее всего, будут теми, которые я уже читал, были пользователями повышения с тех пор, как они появились, Я впервые использовал эту библиотеку, но все их примеры одинаковы, и их документация очень клиническая, не плохая, вы понимаете, что я имею в виду, она читается так, как ее написал компьютер, и использовала одну страницу в качестве шаблона для следующий, так что через некоторое время все документы выглядят одинаково, я долго держался, мне нравится множество примеров с каждой функцией и реальных приложений, которые показывают ее использование, и я не нашел никаких документов на повышение вот так, перейдите по этой ссылке, чтобы понять, что я имею в виду, если вы считаете, что я преувеличиваю или раздражаюсь:

повышение: https://www.boost.org/doc/libs/1_68_0/libs/multiprecision/doc/html/index.html

1 Ответ

1 голос
/ 29 марта 2019

Вам не нужно конвертировать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...