我有一个与这里可用的问题(和答案)有关的问题:
C++ Boost Interval and cos
上面链接中给出的解决方案对我来说适用于大多数三角函数,包括双曲线一次。但是,如果我尝试一次使用此双曲的反函数,让我们以asinh()为例,将得到以下编译器错误:
error C2784: "boost::numeric::interval<T,Policies>
boost::numeric::asinh(const boost::numeric::interval<T,Policies> &)":
could not deduce template argument for "const
boost::numeric::interval<T,Policies> &" from "const double"
产生错误的代码是
#include "stdafx.h"
#include <boost/numeric/interval.hpp>
#include <boost/numeric/interval/rounded_arith.hpp>
using namespace std;
using namespace boost::numeric::interval_lib;
using namespace boost::numeric;
typedef interval<double, policies<save_state<rounded_transc_std<double> >,
checking_base<double> > > Interval;
int _tmain(int argc, _TCHAR* argv[])
{
Interval test = asinh(Interval(1, 1.1));
return 0;
}
我正在使用boost 1_65_1库。如何使双曲函数的反函数运行?
原因之一是解决方法是使用标识
Interval test = log(Interval(1, 1.1) + sqrt(pow(Interval(1, 1.1),2)+1.));
这样可以很好地工作并产生正确的结果。但是,必须可以直接使用已实现的asinh函数。
最佳答案
可能存在与MSVC相关的错误,因为它适用于使用GCC或clang的我:
Live On Coliru(GCC c ++ 03)
Live On Coliru(Clang c ++ 03)
#include <boost/numeric/interval.hpp>
#include <boost/numeric/interval/io.hpp>
#include <boost/numeric/interval/rounded_arith.hpp>
#include <iostream>
namespace bn = boost::numeric;
namespace bni = bn::interval_lib;
typedef bn::interval<double, bni::policies<bni::save_state<bni::rounded_transc_std<double> >,
bni::checking_base<double> > > Interval;
int main()
{
Interval test = asinh(Interval(1, 1.1));
std::cout << test;
}
版画
[0.881374,0.950347]
关于c++ - C++ Boost Interval和asinh,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47529041/