как изменить точность числа во время выполнения с boost :: multiprecision

Я прочитал из boost :: многоцелевая документация:

В зависимости от типа числа точность может быть произвольно большой (ограничена только доступной памятью), фиксированной во время компиляции (например, 50 или 100 десятичных цифр) или переменной, управляемой во время выполнения функциями-членами. Типы с поддержкой шаблонов выражений обеспечивают лучшую производительность, чем простые пользовательские типы.

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

Как я могу создать двойной тип, который позволяет мне изменять его точность во время выполнения?

3

Решение

Большинство серверных номеров имеют только фиксированную емкость по выбору.

Также обратите внимание, что некоторые бэкэнды (в частности, cpp) занимают распределитель, поэтому они / неявно / растут по мере необходимости (до заданного предела):

Обычно cpp_bin_float не выделяет памяти: все пространство, необходимое для его цифр, выделяется непосредственно внутри класса. В результате следует позаботиться о том, чтобы не использовать класс со слишком большим количеством цифр, поскольку требования к пространству стека могут выйти из-под контроля. Если это представляет проблему, то предоставление распределителя в качестве параметра шаблона приводит к cpp_bin_float динамически распределять необходимую память

Позвольте мне проверить документацию на самые популярные бэкэнды:

  • ГМП-х mpf_float придерживается этого:

    typedef number<gmp_float<0> >     mpf_float;
    

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

    typedef mpf_float обеспечивает тип переменной точности, чей
    Точность можно контролировать с помощью функций-членов чисел.

  • Аналогично для бэкэндов MPFR:

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

    Typedef mpfr_float предоставляет тип переменной точности, точность которого можно контролировать с помощью функций-членов number.

Пример использования динамической точности:

// Operations at variable precision and no numeric_limits support:
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

Это уйдет numeric_limits не определено

3

Другие решения

Других решений пока нет …