首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Boost:多精度和cardinal_cubic_b_spline

Boost:多精度和cardinal_cubic_b_spline
EN

Stack Overflow用户
提问于 2022-12-03 22:29:27
回答 2查看 28关注 0票数 2

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

示例代码是

代码语言:javascript
复制
#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在我尝试过的所有其他示例中都起作用。

我得到的错误是:

代码语言:javascript
复制
/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等。我不知道我做错了什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-12-04 01:14:27

选择的类型。是GMP后端。为了给它通常的操作符,它被封装在前端模板number<>中。

住在Coliru

代码语言:javascript
复制
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;
}

打印

代码语言:javascript
复制
a:3, b:2, c:-1
a:3, b:1, c:-1

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

代码语言:javascript
复制
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;

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

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

代码语言:javascript
复制
namespace mp = boost::multiprecision;
using F      = mp::number<mp::gmp_float<50>, mp::et_off>;

现在,它全部编译,并且可能按其应有的方式工作。

住在Coliru

代码语言:javascript
复制
#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;
}

现在印刷:

代码语言:javascript
复制
0.0449663
票数 2
EN

Stack Overflow用户

发布于 2022-12-03 22:55:08

看起来,cardinal_cubic_b_spline类希望输入向量中的元素类型具有定义操作符和abs函数的功能。来自mpf_float_50库的boost::multiprecision::gmp类型没有定义这些函数。您可以通过使用cpp_bin_float_50类型来修复这个问题,该类型确实定义了这些函数。或者,您可以自己为mpf_float_50类型定义操作符和abs函数。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74671304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档