Как изменить точность числа во время выполнения с boost::multiprecision
Я прочитал документацию boost::multiprecision:
В зависимости от типа числа точность может быть произвольно большой (ограничена только доступной памятью), фиксированной во время компиляции (например, 50 или 100 десятичных цифр) или переменной, управляемой во время выполнения функциями-членами. Типы с поддержкой шаблонов выражений обеспечивают лучшую производительность, чем простые пользовательские типы.
Я прочитал еще немного документации, но я не нашел ничего относительно изменения точности во время выполнения. Я видел только шаблоны, которые позволяют мне устанавливать точность во время компиляции, это не то, что я хочу (я хочу создать программу для масштабирования фракталов с использованием очень высокого коэффициента масштабирования).
Как я могу создать двойной тип, который позволяет мне изменять его точность во время выполнения?
1 ответ
Большинство серверных номеров имеют фиксированную емкость только по желанию.
Также обратите внимание, что некоторые бэкэнды (в частности, 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
не определено