根据数字类型,精度可以任意大(仅受可用内存限制),在编译时固定(例如 50 或 100 个十进制数字),或者在运行时由成员函数控制的变量。这些类型启用了表达式模板,以获得比天真的用户定义类型更好的性能。
我已经阅读了更多文档,但我没有发现任何有关在运行时更改精度的信息。我只看到了允许我在编译时设置精度的模板,这不是我想要的(我想创建一个使用非常高的缩放因子来缩放分形的程序)。
如何创建允许我在运行时更改其精度的双精度类型?
根据数字类型,精度可以任意大(仅受可用内存限制),在编译时固定(例如 50 或 100 个十进制数字),或者在运行时由成员函数控制的变量。这些类型启用了表达式模板,以获得比天真的用户定义类型更好的性能。
我已经阅读了更多文档,但我没有发现任何有关在运行时更改精度的信息。我只看到了允许我在编译时设置精度的模板,这不是我想要的(我想创建一个使用非常高的缩放因子来缩放分形的程序)。
如何创建允许我在运行时更改其精度的双精度类型?
大多数数字后端只有可选的固定容量。
还要注意一些后端(特别是 cpp 的)采用分配器,因此它们/隐式/根据需要增长(直到给定限制):
通常
cpp_bin_float
不分配内存:其数字所需的所有空间都直接在类中分配。因此,应注意不要使用位数过多的类,因为堆栈空间需求可能会失控。如果这代表一个问题,那么提供一个分配器作为模板参数会导致cpp_bin_float
动态分配它需要的内存
让我检查一下最流行后端的文档:
gmpmpf_float
坚持这一点:
typedef number<gmp_float<0> > mpf_float;
gmp_float 类型可以通过指定非零 Digits10 模板参数以固定精度使用,或者通过将模板参数设置为零以可变精度使用。
提供
typedef mpf_float
了一个可变精度类型,其精度可以通过 numbers 成员函数来控制。
MPFR 后端类似:
mpfr_float_backend
可以通过指定非零 Digits10 模板参数以固定精度使用类型,也可以通过将模板参数设置为零来以可变精度使用类型。typedef mpfr_float 提供了一个可变精度类型,其精度可以通过 numbers 成员函数来控制。
动态精度使用示例:
// 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
未定义的