我是新使用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等。我不知道我做错了什么。
发布于 2022-12-04 01:14:27
选择的类型。是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发布于 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函数。
https://stackoverflow.com/questions/74671304
复制相似问题