繁体   English   中英

Boost::multiprecision 和 cardinal_cubic_b_spline

[英]Boost::multiprecision and cardinal_cubic_b_spline

我是 boost::multiprecision 库的新手,并尝试将它与 boost::math::interpolators::cardinal_cubic_b_spline 结合使用,但我无法编译程序。

示例代码是

#include <boost/math/interpolators/cardinal_cubic_b_spline.hpp>
#include <iostream>
#include <boost/multiprecision/gmp.hpp>

using boost::multiprecision::mpf_float_50;

int main() {
    std::vector<mpf_float_50> v(10);
    mpf_float_50 step(0.01);

    for (size_t i = 0; i < v.size(); ++i) {
        v.at(i) = sin(i*step);
    }

    mpf_float_50 leftPoint(0.0);
    boost::math::interpolators::cardinal_cubic_b_spline<mpf_float_50> spline(v.begin(), v.end(), leftPoint, step);

    mpf_float_50 x(3.1);
    mpf_float_50 tmpVal = spline(x);
    std::cout << tmpVal << std::endl;

    return 0;
}

当将变量类型更改为 boost::multiprecision::cpp_bin_float_50 时,程序正在运行。 此外,boost::multiprecision::mpf_float_50 在我尝试过的所有其他示例中都有效。

我得到的错误是:

/home/..../main.cpp:19:31:   required from here
/usr/include/boost/math/interpolators/detail/cardinal_cubic_b_spline_detail.hpp:50:10: error: conversion from ‘expression<boost::multiprecision::detail::function,boost::multiprecision::detail::abs_funct<boost::multiprecision::backends::gmp_float<50> >,boost::multiprecision::detail::expression<boost::multiprecision::detail::subtract_immediates, boost::multiprecision::number<boost::multiprecision::backends::gmp_float<50> >, long unsigned int, void, void>,[...],[...]>’ to non-scalar type ‘expression<boost::multiprecision::detail::subtract_immediates,boost::multiprecision::number<boost::multiprecision::backends::gmp_float<50> >,long unsigned int,[...],[...]>’ requested

cpp_dec_float_50、mpfr_float_50 等出现了同样的错误。我不确定我做错了什么。

所选类型。 是 GMP 后端。 为了给它通常的运算符,它被包装在前端模板number<>中:

生活在 Coliru

using F = boost::multiprecision::mpf_float_50;

int main() {
    F a = 3, b = 2;
    F c = b - a;
    std::cout << "a:" << a << ", b:" << b << ", c:" << c << std::endl;

    b = abs(b - a);
    std::cout << "a:" << a << ", b:" << b << ", c:" << c << std::endl;
}

印刷

a:3, b:2, c:-1
a:3, b:1, c:-1

但是, number<>默认启用表达式模板。 这意味着, typeof(F{} - F{})不一定是F ,而是类似于:

namespace mp = boost::multiprecision;
using F      = mp::mpf_float_50;

int main() {
    F a = 3, b = 2;

    mp::detail::expression<mp::detail::subtract_immediates, F, F> //
        c = b - a;

模板表达式可以极大地优化某些代码,例如通过简化复杂表达式的计算。

但是,一些通用代码不能很好地处理表达式模板。 因此你可以关闭它们:

namespace mp = boost::multiprecision;
using F      = mp::number<mp::gmp_float<50>, mp::et_off>;

现在它全部编译,并且可能按预期工作。

生活在 Coliru

#include <boost/math/interpolators/cardinal_cubic_b_spline.hpp>
#include <iostream>
#include <boost/multiprecision/gmp.hpp>

namespace mp = boost::multiprecision;
using F      = mp::number<mp::gmp_float<50>, mp::et_off>;

int main() {
    std::vector<F> v(10);
    F              step(0.01);

    for (size_t i = 0; i < v.size(); ++i) {
        v.at(i) = sin(i * step);
    }

    F leftPoint(0.0);
    boost::math::interpolators::cardinal_cubic_b_spline<F> spline(v.begin(), v.end(), leftPoint, step);

    F x(3.1);
    F tmpVal = spline(x);
    std::cout << tmpVal << std::endl;
}

现在打印:

0.0449663

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM