📄 quaternion_test.cpp
字号:
// test file for quaternion.hpp// (C) Copyright Hubert Holin 2001.// Distributed under the Boost Software License, Version 1.0. (See// accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)#include <iomanip>#include <boost/mpl/list.hpp>#include <boost/test/unit_test.hpp>#include <boost/test/unit_test_log.hpp>#include <boost/test/test_case_template.hpp>#include <boost/math/quaternion.hpp>template<typename T>struct string_type_name;#define DEFINE_TYPE_NAME(Type) \template<> struct string_type_name<Type> \{ \ static char const * _() \ { \ return #Type; \ } \}DEFINE_TYPE_NAME(float);DEFINE_TYPE_NAME(double);DEFINE_TYPE_NAME(long double);#ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONStypedef boost::mpl::list<float,double,long double> test_types;#elsetypedef boost::mpl::list<float,double> test_types;#endif// Apple GCC 4.0 uses the "double double" format for its long double,// which means that epsilon is VERY small but useless for// comparisons. So, don't do those comparisons.#if (defined(__APPLE_CC__) && defined(__GNUC__) && __GNUC__ == 4) || defined(BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONS)typedef boost::mpl::list<float,double> near_eps_test_types;#elsetypedef boost::mpl::list<float,double,long double> near_eps_test_types;#endif#if BOOST_WORKAROUND(__GNUC__, < 3) // gcc 2.x ignores function scope using declarations, // put them in the scope of the enclosing namespace instead:using ::std::sqrt;using ::std::atan;using ::std::log;using ::std::exp;using ::std::cos;using ::std::sin;using ::std::tan;using ::std::cosh;using ::std::sinh;using ::std::tanh;using ::std::numeric_limits;using ::boost::math::abs;#endif /* BOOST_WORKAROUND(__GNUC__, < 3) */#ifdef BOOST_NO_STDC_NAMESPACEusing ::sqrt;using ::atan;using ::log;using ::exp;using ::cos;using ::sin;using ::tan;using ::cosh;using ::sinh;using ::tanh;#endif /* BOOST_NO_STDC_NAMESPACE */#ifdef BOOST_NO_ARGUMENT_DEPENDENT_LOOKUPusing ::boost::math::real;using ::boost::math::unreal;using ::boost::math::sup;using ::boost::math::l1;using ::boost::math::abs;using ::boost::math::norm;using ::boost::math::conj;using ::boost::math::exp;using ::boost::math::pow;using ::boost::math::cos;using ::boost::math::sin;using ::boost::math::tan;using ::boost::math::cosh;using ::boost::math::sinh;using ::boost::math::tanh;using ::boost::math::sinc_pi;using ::boost::math::sinhc_pi;#endif /* BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP */ // Provide standard floating point abs() overloads if older Microsoft// library is used with _MSC_EXTENSIONS defined. This code also works// for the Intel compiler using the Microsoft library.#if defined(_MSC_EXTENSIONS) && BOOST_WORKAROUND(_MSC_VER, < 1310)#if !((__INTEL__ && _WIN32) && BOOST_WORKAROUND(__MWERKS__, >= 0x3201))inline float abs(float v){ return(fabs(v));}inline double abs(double v){ return(fabs(v));}inline long double abs(long double v){ return(fabs(v));}#endif /* !((__INTEL__ && _WIN32) && BOOST_WORKAROUND(__MWERKS__, >= 0x3201)) */#endif /* defined(_MSC_EXTENSIONS) && BOOST_WORKAROUND(_MSC_VER, < 1310) */// explicit (if ludicrous) instanciation#if !BOOST_WORKAROUND(__GNUC__, < 3)template class ::boost::math::quaternion<int>;#else// gcc doesn't like the absolutely-qualified namespacetemplate class boost::math::quaternion<int>;#endif /* !BOOST_WORKAROUND(__GNUC__) */void quaternion_manual_test(){ // tests for evaluation by humans // using default constructor ::boost::math::quaternion<float> q0; ::boost::math::quaternion<float> qa[2]; // using constructor "H seen as R^4" ::boost::math::quaternion<double> q1(1,2,3,4); ::std::complex<float> c0(5,6); // using constructor "H seen as C^2" ::boost::math::quaternion<float> q2(c0); // using UNtemplated copy constructor ::boost::math::quaternion<float> q3(q2); // using templated copy constructor ::boost::math::quaternion<long double> q4(q3); // using UNtemplated assignment operator q3 = q0; qa[0] = q0; // using templated assignment operator q4 = q0; qa[1] = q1; float f0(7); // using converting assignment operator q2 = f0; // using converting assignment operator q3 = c0; // using += (const T &) q2 += f0; // using += (const ::std::complex<T> &) q2 += c0; // using += (const quaternion<X> &) q2 += q3; // using -= (const T &) q3 -= f0; // using -= (const ::std::complex<T> &) q3 -= c0; // using -= (const quaternion<X> &) q3 -= q2; double d0(8); ::std::complex<double> c1(9,10); // using *= (const T &) q1 *= d0; // using *= (const ::std::complex<T> &) q1 *= c1; // using *= (const quaternion<X> &) q1 *= q1; long double l0(11); ::std::complex<long double> c2(12,13); // using /= (const T &) q4 /= l0; // using /= (const ::std::complex<T> &) q4 /= c2; // using /= (const quaternion<X> &) q4 /= q1; // using + (const T &, const quaternion<T> &) ::boost::math::quaternion<float> q5 = f0+q2; // using + (const quaternion<T> &, const T &) ::boost::math::quaternion<float> q6 = q2+f0; // using + (const ::std::complex<T> &, const quaternion<T> &) ::boost::math::quaternion<float> q7 = c0+q2; // using + (const quaternion<T> &, const ::std::complex<T> &) ::boost::math::quaternion<float> q8 = q2+c0; // using + (const quaternion<T> &,const quaternion<T> &) ::boost::math::quaternion<float> q9 = q2+q3; // using - (const T &, const quaternion<T> &) q5 = f0-q2; // using - (const quaternion<T> &, const T &) q6 = q2-f0; // using - (const ::std::complex<T> &, const quaternion<T> &) q7 = c0-q2; // using - (const quaternion<T> &, const ::std::complex<T> &) q8 = q2-c0; // using - (const quaternion<T> &,const quaternion<T> &) q9 = q2-q3; // using * (const T &, const quaternion<T> &) q5 = f0*q2; // using * (const quaternion<T> &, const T &) q6 = q2*f0; // using * (const ::std::complex<T> &, const quaternion<T> &) q7 = c0*q2; // using * (const quaternion<T> &, const ::std::complex<T> &) q8 = q2*c0; // using * (const quaternion<T> &,const quaternion<T> &) q9 = q2*q3; // using / (const T &, const quaternion<T> &) q5 = f0/q2; // using / (const quaternion<T> &, const T &) q6 = q2/f0; // using / (const ::std::complex<T> &, const quaternion<T> &) q7 = c0/q2; // using / (const quaternion<T> &, const ::std::complex<T> &) q8 = q2/c0; // using / (const quaternion<T> &,const quaternion<T> &) q9 = q2/q3; // using + (const quaternion<T> &) q2 = +q0; // using - (const quaternion<T> &) q2 = -q3; // using == (const T &, const quaternion<T> &) f0 == q2; // using == (const quaternion<T> &, const T &) q2 == f0; // using == (const ::std::complex<T> &, const quaternion<T> &) c0 == q2; // using == (const quaternion<T> &, const ::std::complex<T> &) q2 == c0; // using == (const quaternion<T> &,const quaternion<T> &) q2 == q3; // using != (const T &, const quaternion<T> &) f0 != q2; // using != (const quaternion<T> &, const T &) q2 != f0; // using != (const ::std::complex<T> &, const quaternion<T> &) c0 != q2; // using != (const quaternion<T> &, const ::std::complex<T> &) q2 != c0; // using != (const quaternion<T> &,const quaternion<T> &) q2 != q3; BOOST_MESSAGE("Please input a quaternion..."); #ifdef BOOST_INTERACTIVE_TEST_INPUT_ITERATOR ::std::cin >> q0; if (::std::cin.fail()) { BOOST_MESSAGE("You have entered nonsense!"); } else { BOOST_MESSAGE("You have entered the quaternion "<< q0 << " ."); }#else ::std::istringstream bogus("(1,2,3,4)"); bogus >> q0; BOOST_MESSAGE("You have entered the quaternion " << q0 << " .");#endif BOOST_MESSAGE("For this quaternion:"); BOOST_MESSAGE( "the value of the real part is " << real(q0)); BOOST_MESSAGE( "the value of the unreal part is " << unreal(q0)); BOOST_MESSAGE( "the value of the sup norm is " << sup(q0)); BOOST_MESSAGE( "the value of the l1 norm is " << l1(q0)); BOOST_MESSAGE( "the value of the magnitude (euclidian norm) is " << abs(q0)); BOOST_MESSAGE( "the value of the (Cayley) norm is " << norm(q0)); BOOST_MESSAGE( "the value of the conjugate is " << conj(q0)); BOOST_MESSAGE( "the value of the exponential is " << exp(q0)); BOOST_MESSAGE( "the value of the cube is " << pow(q0,3)); BOOST_MESSAGE( "the value of the cosinus is " << cos(q0)); BOOST_MESSAGE( "the value of the sinus is " << sin(q0)); BOOST_MESSAGE( "the value of the tangent is " << tan(q0)); BOOST_MESSAGE( "the value of the hyperbolic cosinus is " << cosh(q0)); BOOST_MESSAGE( "the value of the hyperbolic sinus is " << sinh(q0)); BOOST_MESSAGE( "the value of the hyperbolic tangent is " << tanh(q0)); #ifdef BOOST_NO_TEMPLATE_TEMPLATES BOOST_MESSAGE("no template templates, can't compute cardinal functions");#else /* BOOST_NO_TEMPLATE_TEMPLATES */ BOOST_MESSAGE( "the value of " << "the Sinus Cardinal (of index pi) is " << sinc_pi(q0)); BOOST_MESSAGE( "the value of " << "the Hyperbolic Sinus Cardinal (of index pi) is "
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -