【问题标题】:how to change at runtime number precision with boost::multiprecision如何使用 boost::multiprecision 在运行时更改数字精度
【发布时间】:2016-02-24 06:43:30
【问题描述】:

我读过boost::multiprecision documentation

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

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

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

【问题讨论】:

    标签: c++ boost multiprecision boost-multiprecision


    【解决方案1】:

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

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

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

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

    • gmp 的mpf_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未定义

    【讨论】:

    • 所以不使用后端就没有办法设置可变精度?
    • 如果没有后端,您将无法进行任何事情。但也许你的意思是“不使用 Boost-only (cpp) 后端”。我认为这是正确的
    猜你喜欢
    • 2015-07-17
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多