如何使用boost :: multiprecision

时间:2015-11-21 22:32:10

标签: c++ boost multiprecision boost-multiprecision

我已阅读boost::multiprecision documentation

  

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

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

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

1 个答案:

答案 0 :(得分:3)

大多数后端只有可选的固定容量。

还要注意一些后端(值得注意的是cpp)接受一个分配器,所以它们/隐式/按需增长(直到给定的限制):

  

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

让我查看最受欢迎的后端的文档:

  • gmp' s mpf_float坚持这一点:

    typedef number<gmp_float<0> >     mpf_float;
    
      

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

         

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