Невозможно программно изменить точность повышения точности mpfr с множественной точностью

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

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

 #include <boost/multiprecision/mpfr.hpp>

 QString multiply(const QString &mThis, const QString &mThat, const unsigned int &precison)
 {
    typedef boost::multiprecision::number<mpfr_float_backend<0> > my_mpfr_float;
    my_mpfr_float aThis(mThis.toStdString());
    my_mpfr_float aThat(mThat.toStdString());
    my_mpfr_float::default_precision(precison);
    my_mpfr_float ans = (aThis * aThat);
    return QString::fromStdString(ans.str());
 } 

Я пробовал без typedef, та же проблема;

MathWizard::multiply("123456789.123456789", "123456789.123456789", 20);

18 цифр точности, 9 + 9, я должен просить 30

вернет 22 десятичных знака

15241578780673678.51562

вместо 20

15241578780673678.516

Так почему же он выключен на 2?

Я хотел бы сделать изменение точности после математики, но, похоже, вы должны установить его раньше, а не так, как примеры, которые показывает boost в своем примере, но все равно не возвращает правильное значение, делая это после не изменяет значение .

Обновление: сравните то, что я сделал, с тем, что они говорят, работает в этом сообщении: >как изменить точность числа во время выполнения с помощью boost::multiprecision

 typedef number<gmp_float<0> >     mpf_float;
 mpfr_float a = 2;
 mpfr_float::default_precision(1000);
 std::cout << mpfr_float::default_precision() << std::endl;
 std::cout << sqrt(a) << std::endl; // print root-2

Я заметил различия между gmp_float, mpf_float (с использованием boost/multiprecision/gmp.hpp) и mpfr_float, и mpfr_float даст мне более высокую точность, например, если я возьму число (1/137):

 mpf_float
 0.007299270072992700729927007299270072992700729927007299270073
 only 1 Precision, 23 digits when set to 13
 0.00729927007299270072993
 mpfr_float
 0.007299270072992700729929
 only 1 Precision, 16 digits when set to 13
 0.0072992700729928

Только с 1 точностью я ожидаю, что мой ответ будет иметь меньше десятичного числа.

Другие типы данных работают аналогично, я попробовал их все, поэтому этот код будет работать одинаково для всех типов данных, описанных здесь:

boost 1.69.0: многоточность Глава 1

Я также должен указать, что я полагаюсь на Qt, поскольку эта функция используется в приложении QtQuick Qml Felgo, и на самом деле я не мог понять, как преобразовать это в строку без преобразования в показатель степени, хотя я использовал ans.str() для обоих я предполагаю, что fromStdString делает что-то другое, чем std::string(ans.str()).

Я полагаю, что если я не смогу понять его, я просто сделаю округление строк, чтобы получить правильную точность.

 std::stringstream ss;
 ss.imbue(std::locale(""));
 ss << std::fixed << std::setprecision(int(precison)) << ans.str();
 qDebug() << "divide(" << mThis << "/" << mThat << " @ " << precison << " =" << QString::fromStdString(ss.str()) << ")";
 return QString::fromStdString(ss.str());

Я все еще не мог обойтись без использования QString, но это не сработало, оно возвращает 16 цифр вместо 13, я знаю, что это другой вопрос, поэтому я просто публикую его, чтобы показать, что мои альтернативы на данный момент не работают лучше. . Также обратите внимание, что функция деления работает так же, как и умножение, я использовал этот пример, чтобы показать, что математика не имеет к этому никакого отношения, но все примеры, которые они мне показывают, работают неправильно, и я не понимаю, почему , так что просто чтобы сделать шаги понятными:

  1. Создайте серверную часть: typedef boost::multiprecision::number > my_mpfr_float;
  2. Установите точность: my_mpfr_float::default_precision (точность);
  3. Установить начальное значение переменной: my_mpfr_float aThis(mThis.toStdString());
  4. Посчитайте, если хотите, верните значение с правильной точностью.

Я должен что-то упустить.

Я знаю, что могу просто получить длину строки, и если она длиннее Precision, то проверьте, больше ли Precision + 1 5, если да, добавьте 1 к Precision и верните подстроку 0, Precision и покончите со всем этим. способ делать что-то, я мог бы даже сделать это в JavaScript после возврата и просто забыть о правильном способе, но я все еще думаю, что просто что-то упускаю, потому что я не могу поверить, что это так, как это на самом деле должно быть Работа.

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


person user83395    schedule 31.03.2019    source источник
comment
Я собирался редактировать теги, но их больше нет, но я имел в виду, что это в Qt с использованием boost, и вы правы, это не имеет никакого значения, спасибо, что указали на это, вы действительно знаете, что вы делаете, у вас есть отличный послужной список, на самом деле он не имеет ничего общего со строкой, просто вы устанавливаете точность, которую я сделал, согласно документам boost, поэтому я должен упустить что-то простое, но не могу найти много примеров того, как использовать любой из этих типов с множественной точностью.   -  person user83395    schedule 31.03.2019
comment
Теги служат для привлечения внимания сообществ, существующих в SO, с помощью тегов qt + boost вызывает сообщество, которое использует обе библиотеки, меньшее, чем сообщество boost и qt, вместо этого, если вы используете только boost сообщество будет тем, кого вы привлечете. вывод: хорошо выбирайте метки и перепишите свой пример так, чтобы он не зависел от Qt.   -  person eyllanesc    schedule 31.03.2019
comment
Если я попытаюсь преобразовать его в строку вместо QString, он изменит ответ на экспоненциальный, а мне он нужен как десятичный, и я не могу найти примеры с использованием преобразования с множественной точностью в строку, что является частью моей проблемы, Я действительно не знаю, как полностью использовать эту функцию из-за отсутствия примеров, поэтому мне нужно использовать Qt, чтобы этот пример работал правильно, пока я не найду другой способ преобразования из мультиточности в строку, даже используя cout, он преобразует ее к экспоненциальному. Но я понимаю, что мне нужно свести пример к минимуму и попробовать.   -  person user83395    schedule 31.03.2019
comment
Я обновил свой ответ, чтобы он был более конкретным, предоставил ссылки и код с результатами того, что я нашел. Это приложение Qt Qml, поэтому этот C++ возвращается в Qml в виде строки, и преобразование больших чисел в числа снижает его точность, если он не может с этим справиться. Мне нужно знать, действительно ли эти примеры работают, имейте в виду, что закрыть это не вариант, который у меня есть в математике, мне нужно точное значение с фиксированной точностью, поэтому мне нужно, чтобы эти примеры работали, потому что если они работают, все, что я делать то, что они говорят мне делать, так почему мой код не работает?   -  person user83395    schedule 01.04.2019