Я пишу скоро появившийся 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
Спасибо за любую помощь.