📄 octonion_test.cpp
字号:
// test file for octonion.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/octonion.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);#ifndef BOOST_MATH_NO_LONG_DOUBLE_MATH_FUNCTIONSDEFINE_TYPE_NAME(long double);#endif#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) && defined(_MSC_VER) && _MSC_VER < 1310inline 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 /* BOOST_WORKAROUND(BOOST_MSVC) */// explicit (if ludicrous) instanciation#if !BOOST_WORKAROUND(__GNUC__, < 3)template class ::boost::math::octonion<int>;#else// gcc doesn't like the absolutely-qualified namespacetemplate class boost::math::octonion<int>;#endif /* !BOOST_WORKAROUND(__GNUC__) */namespace{ template<typename T> ::boost::math::octonion<T> index_i_element(int idx) { return( ::boost::math::octonion<T>( (idx == 0) ? static_cast<T>(1) : static_cast<T>(0), (idx == 1) ? static_cast<T>(1) : static_cast<T>(0), (idx == 2) ? static_cast<T>(1) : static_cast<T>(0), (idx == 3) ? static_cast<T>(1) : static_cast<T>(0), (idx == 4) ? static_cast<T>(1) : static_cast<T>(0), (idx == 5) ? static_cast<T>(1) : static_cast<T>(0), (idx == 6) ? static_cast<T>(1) : static_cast<T>(0), (idx == 7) ? static_cast<T>(1) : static_cast<T>(0) )); }}void octonion_manual_test(){ // tests for evaluation by humans // using default constructor ::boost::math::octonion<float> o0; ::boost::math::octonion<float> oa[2]; // using constructor "O seen as R^8" ::boost::math::octonion<float> o1(1,2,3,4,5,6,7,8); ::std::complex<double> c0(9,10); // using constructor "O seen as C^4" ::boost::math::octonion<double> o2(c0); ::boost::math::quaternion<long double> q0(11,12,13,14); // using constructor "O seen as H^2" ::boost::math::octonion<long double> o3(q0); // using UNtemplated copy constructor ::boost::math::octonion<float> o4(o1); // using templated copy constructor ::boost::math::octonion<long double> o5(o2); // using UNtemplated assignment operator o5 = o3; oa[0] = o0; // using templated assignment operator o5 = o2; oa[1] = o5; float f0(15); // using converting assignment operator o0 = f0; // using converting assignment operator o2 = c0; // using converting assignment operator o5 = q0; // using += (const T &) o4 += f0; // using += (const ::std::complex<T> &) o2 += c0; // using += (const ::boost::math::quaternion<T> &) o3 += q0; // using += (const quaternion<X> &) o5 += o4; // using -= (const T &) o1 -= f0; // using -= (const ::std::complex<T> &) o2 -= c0; // using -= (const ::boost::math::quaternion<T> &) o5 -= q0; // using -= (const octonion<X> &) o3 -= o4; double d0(16); ::std::complex<double> c1(17,18); ::boost::math::quaternion<double> q1(19,20,21,22); // using *= (const T &) o2 *= d0; // using *= (const ::std::complex<T> &) o2 *= c1; // using *= (const ::boost::math::quaternion<T> &) o2 *= q1; // using *= (const octonion<X> &) o2 *= o4; long double l0(23); ::std::complex<long double> c2(24,25); // using /= (const T &) o5 /= l0; // using /= (const ::std::complex<T> &) o5 /= c2; // using /= (const quaternion<X> &) o5 /= q0; // using /= (const octonion<X> &) o5 /= o5; // using + (const T &, const octonion<T> &) ::boost::math::octonion<float> o6 = f0+o0; // using + (const octonion<T> &, const T &) ::boost::math::octonion<float> o7 = o0+f0; // using + (const ::std::complex<T> &, const quaternion<T> &) ::boost::math::octonion<double> o8 = c0+o2; // using + (const octonion<T> &, const ::std::complex<T> &) ::boost::math::octonion<double> o9 = o2+c0; // using + (const ::boost::math::quaternion<T>, const octonion<T> &) ::boost::math::octonion<long double> o10 = q0+o3; // using + (const octonion<T> &, const ::boost::math::quaternion<T> &) ::boost::math::octonion<long double> o11 = o3+q0; // using + (const quaternion<T> &,const quaternion<T> &) ::boost::math::octonion<float> o12 = o0+o4; // using - (const T &, const octonion<T> &) o6 = f0-o0; // using - (const octonion<T> &, const T &) o7 = o0-f0; // using - (const ::std::complex<T> &, const octonion<T> &) o8 = c0-o2; // using - (const octonion<T> &, const ::std::complex<T> &) o9 = o2-c0; // using - (const quaternion<T> &,const octonion<T> &) o10 = q0-o3; // using - (const octonion<T> &,const quaternion<T> &) o11 = o3-q0; // using - (const octonion<T> &,const octonion<T> &) o12 = o0-o4; // using * (const T &, const octonion<T> &) o6 = f0*o0; // using * (const octonion<T> &, const T &) o7 = o0*f0; // using * (const ::std::complex<T> &, const octonion<T> &) o8 = c0*o2; // using * (const octonion<T> &, const ::std::complex<T> &) o9 = o2*c0; // using * (const quaternion<T> &,const octonion<T> &) o10 = q0*o3; // using * (const octonion<T> &,const quaternion<T> &) o11 = o3*q0; // using * (const octonion<T> &,const octonion<T> &) o12 = o0*o4; // using / (const T &, const octonion<T> &) o6 = f0/o0; // using / (const octonion<T> &, const T &) o7 = o0/f0; // using / (const ::std::complex<T> &, const octonion<T> &) o8 = c0/o2; // using / (const octonion<T> &, const ::std::complex<T> &) o9 = o2/c0; // using / (const ::boost::math::quaternion<T> &, const octonion<T> &) o10 = q0/o3; // using / (const octonion<T> &, const ::boost::math::quaternion<T> &) o11 = o3/q0; // using / (const octonion<T> &,const octonion<T> &) o12 = o0/o4; // using + (const octonion<T> &) o4 = +o0; // using - (const octonion<T> &) o0 = -o4; // using == (const T &, const octonion<T> &) f0 == o0; // using == (const octonion<T> &, const T &) o0 == f0; // using == (const ::std::complex<T> &, const octonion<T> &) c0 == o2; // using == (const octonion<T> &, const ::std::complex<T> &) o2 == c0; // using == (const ::boost::math::quaternion<T> &, const octonion<T> &) q0 == o3; // using == (const octonion<T> &, const ::boost::math::quaternion<T> &) o3 == q0; // using == (const octonion<T> &,const octonion<T> &) o0 == o4; // using != (const T &, const octonion<T> &)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -