我有一个与这里可用的问题(和答案)有关的问题:
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/

10-17 01:33