Проблема с неправильным числом округления числа десятичных дробей при использовании повышения точности - PullRequest
0 голосов
/ 02 апреля 2019

Я пишу скоро появившийся github C ++ для проекта приложения Qml Felgo под названием «Калькулятор галактики», который использует строки для представления очень больших чисел и десятичных дробей, который не может быть точно представлен как float, double или long double, моя цель здесь - взять очень большие десятичные строки и округлить их до указанной точности, так что читая форсированные документы:

Повышение: https://www.boost.org/doc/libs/1_69_0/libs/multiprecision/doc/html/boost_multiprecision/tut/floats/mpfr_float.html

"Тип mpfr_float_backend можно использовать с фиксированной точностью, указав ненулевой параметр шаблона Digits10, или с переменной точностью, установив аргумент шаблона в ноль."

Я использовал это:

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

Установка его в 0 должна позволить мне сделать это:

 my_mpfr_float::default_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 должно привести к х.0 в худшем случае, но 13 цифр должно быть 13, а не 16, а 3 дает мне 7, а 0 дает мне 4, и 0 является одним из тех вариантов, мне действительно нужно, чтобы это было 0, это начинает выглядеть как ошибка в повышении, или это просто не работает так, как я ожидал, Я надеялся, что это нормализует число к правильному количеству цифр.

Не путайте это поведение с числами с плавающей запятой или десятичными знаками, которые хранят знак в дополнительном байте, это не является проблемой.

Точность на шкале, о которой я говорю, измеряется в световых годах, так что только 1 десятичное место может представлять мили, футы или дюймы, вплоть до наименьшего масштаба измерения, поэтому, когда мне нужно конкретное количество цифр, это важно для расчетов

Обновление: отправлено сообщение об ошибке: https://github.com/boostorg/multiprecision/issues/127

Спасибо за любую помощь.

...