如何使用boost::multiprecision在运行时更改数字精度



我已经阅读了boost::multiprecision文档:

根据数字类型的不同,精度可以是任意大的(仅受可用内存的限制)、在编译时固定的(例如50或100个十进制数字),或者在运行时由成员函数控制的变量。这些类型启用了表达式模板,与天真的用户定义类型相比性能更好。

我阅读了更多的文档,但没有发现任何关于在运行时更改精度的内容。我只看到了允许我在编译时设置精度的模板,这不是我想要的(我想创建一个使用非常高的缩放因子缩放分形的程序)。

如何创建允许在运行时更改其精度的双重类型?

大多数后端都有固定容量,只有可选

还要注意,一些后端(值得注意的是cpp后端)使用分配器,因此它们/隐式地/根据需要增长(直到给定的限制):

通常cpp_bin_float不分配内存:其数字所需的所有空间都直接在类中分配。因此,应注意不要使用位数过高的类,因为堆栈空间需求可能会失控。如果这代表了一个问题,那么提供一个分配器作为模板参数会导致cpp_bin_float动态分配它需要的内存

让我查看文档中最流行的后端:

  • gmp的mpf_float坚持这一点:

    typedef number<gmp_float<0> >     mpf_float;
    

    gmp_float类型可以通过指定非零Digits10模板参数以固定精度使用,或通过将模板参数设置为零以可变精度使用

    typedef mpf_float提供了一种可变精度类型可以通过数字成员函数来控制精度。

  • 类似于MPFR后端:

    类型mpfr_float_backend可以通过指定非零的Digits10模板参数以固定精度使用,也可以通过将模板参数设置为零以可变精度使用。

    typedef mpfr_float提供了一个可变精度类型,其精度可以通过数字成员函数控制。

动态精度使用示例:

// 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未定义

相关内容

  • 没有找到相关文章

最新更新