Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

八元數非成員運算符

一元 正號 和 負號 運算符
template<typename T> octonion<T> operator + (octonion<T> const & o);

這個一元 正號 運算符僅僅是將 八元數 o 返回.

template<typename T> octonion<T> operator - (octonion<T> const & o);

這個一元 負號 運算符返回 八元數 o 的相反數.

二元加法運算符
template<typename T> octonion<T> operator + (T const & lhs, octonion<T> const & rhs);
template<typename T> octonion<T> operator + (octonion<T> const & lhs, T const & rhs);
template<typename T> octonion<T> operator + (::std::complex<T> const & lhs, octonion<T> const & rhs);
template<typename T> octonion<T> operator + (octonion<T> const & lhs, ::std::complex<T> const & rhs);
template<typename T> octonion<T> operator + (::boost::math::quaternion<T> const & lhs, octonion<T> const & rhs);
template<typename T> octonion<T> operator + (octonion<T> const & lhs, ::boost::math::quaternion<T> const & rhs);
template<typename T> octonion<T> operator + (octonion<T> const & lhs, octonion<T> const & rhs);

這個二元加法運算符返回八元數<T>(lhs) += rhs的結果.

二元減法運算符
template<typename T> octonion<T> operator - (T const & lhs, octonion<T> const & rhs);
template<typename T> octonion<T> operator - (octonion<T> const & lhs, T const & rhs);
template<typename T> octonion<T> operator - (::std::complex<T> const & lhs, octonion<T> const & rhs);
template<typename T> octonion<T> operator - (octonion<T> const & lhs, ::std::complex<T> const & rhs);
template<typename T> octonion<T> operator - (::boost::math::quaternion<T> const & lhs, octonion<T> const & rhs);
template<typename T> octonion<T> operator - (octonion<T> const & lhs, ::boost::math::quaternion<T> const & rhs);
template<typename T> octonion<T> operator - (octonion<T> const & lhs, octonion<T> const & rhs);

這個二元減法運算符返回八元數<T>(lhs) -= rhs的結果.

二元乘法運算符
template<typename T> octonion<T> operator * (T const & lhs, octonion<T> const & rhs);
template<typename T> octonion<T> operator * (octonion<T> const & lhs, T const & rhs);
template<typename T> octonion<T> operator * (::std::complex<T> const & lhs, octonion<T> const & rhs);
template<typename T> octonion<T> operator * (octonion<T> const & lhs, ::std::complex<T> const & rhs);
template<typename T> octonion<T> operator * (::boost::math::quaternion<T> const & lhs, octonion<T> const & rhs);
template<typename T> octonion<T> operator * (octonion<T> const & lhs, ::boost::math::quaternion<T> const & rhs);
template<typename T> octonion<T> operator * (octonion<T> const & lhs, octonion<T> const & rhs);

這個乘法運算符返回八元數<T>(lhs) *= rhs的結果.

二元除法運算符
template<typename T> octonion<T> operator / (T const & lhs, octonion<T> const & rhs);
template<typename T> octonion<T> operator / (octonion<T> const & lhs, T const & rhs);
template<typename T> octonion<T> operator / (::std::complex<T> const & lhs, octonion<T> const & rhs);
template<typename T> octonion<T> operator / (octonion<T> const & lhs, ::std::complex<T> const & rhs);
template<typename T> octonion<T> operator / (::boost::math::quaternion<T> const & lhs, octonion<T> const & rhs);
template<typename T> octonion<T> operator / (octonion<T> const & lhs, ::boost::math::quaternion<T> const & rhs);
template<typename T> octonion<T> operator / (octonion<T> const & lhs, octonion<T> const & rhs);

這個二元符法運算符返回八元數<T>(lhs) /= rhs的結果. 除以 0 依然是一個錯誤...

二元相等運算符
template<typename T> bool operator == (T const & lhs, octonion<T> const & rhs);
template<typename T> bool operator == (octonion<T> const & lhs, T const & rhs);
template<typename T> bool operator == (::std::complex<T> const & lhs, octonion<T> const & rhs);
template<typename T> bool operator == (octonion<T> const & lhs, ::std::complex<T> const & rhs);
template<typename T> bool operator == (::boost::math::quaternion<T> const & lhs, octonion<T> const & rhs);
template<typename T> bool operator == (octonion<T> const & lhs, ::boost::math::quaternion<T> const & rhs);
template<typename T> bool operator == (octonion<T> const & lhs, octonion<T> const & rhs);

當且僅當octonion<T>(lhs) 中的四個成員分別與 octonion<T>(rhs) 中的四個對應 的成員分別相等這個運算符返回 真. 與任何的浮點數一樣, 這本質上是沒有意義的. (譯注:作者的意思是這樣的,從本質上來說,比較兩個八元數相等是 沒有意義的,因為,任意一個八元數的表示都是不絕對精確的,正是因為如此,判斷兩個不精確的量是否相等 本質上是沒有意義的,這一點類似於我們判斷兩個浮點數是否相等,因為對於任意一個浮點數,計算機都不可能 精確的表示出來,這一點由計算機的固有特性決定.正是因為計算機無法精確的表示出任意一個浮點數, 所以,判斷兩個浮點數是否相等本質上也是沒有意義的)

二元不相等運算符
template<typename T> bool operator != (T const & lhs, octonion<T> const & rhs);
template<typename T> bool operator != (octonion<T> const & lhs, T const & rhs);
template<typename T> bool operator != (::std::complex<T> const & lhs, octonion<T> const & rhs);
template<typename T> bool operator != (octonion<T> const & lhs, ::std::complex<T> const & rhs);
template<typename T> bool operator != (::boost::math::quaternion<T> const & lhs, octonion<T> const & rhs);
template<typename T> bool operator != (octonion<T> const & lhs, ::boost::math::quaternion<T> const & rhs);
template<typename T> bool operator != (octonion<T> const & lhs, octonion<T> const & rhs);

當且僅當octonion<T>(lhs) == octonion<T>(rhs) 為假 的時候這個運算符返回 真.與任何的浮點類型實體一樣, 這本質上是沒有意義.

流抽取運算符
template<typename T, typename charT, class traits>
::std::basic_istream<charT,traits> & operator >> (::std::basic_istream<charT,traits> & is, octonion<T> & o);

抽取一個八元數 o. 我們接受任何看起來合理的格式. 然而, 因為這樣會導致許多二義性, 我們決定放棄這些. 為了防止產生疑惑,僅僅支持從一串實數中抽取並構造一個八元數.

輸入值必須能夠轉換為T類型的值. 如果遇到了不合法的輸入, 將會調用函數 is.setstate(ios::failbit) (該函數將會拋出異常 ios::failure (27.4.5.3)).

返回 is.

流插入運算符
template<typename T, typename charT, class traits>
::std::basic_ostream<charT,traits> & operator << (::std::basic_ostream<charT,traits> & os, octonion<T> const & o);

將八元數插入到o 輸出流 os中 就像它被實現為下面這樣:

template<typename T, typename charT, class traits>
::std::basic_ostream<charT,traits> & operator << ( ::std::basic_ostream<charT,traits> & os,
octonion<T> const & o)
{
   ::std::basic_ostringstream<charT,traits> s;

   s.flags(os.flags());
   s.imbue(os.getloc());
   s.precision(os.precision());

   s << '(' << o.R_component_1() << ','
      << o.R_component_2() << ','
      << o.R_component_3() << ','
      << o.R_component_4() << ','
      << o.R_component_5() << ','
      << o.R_component_6() << ','
      << o.R_component_7() << ','
      << o.R_component_8() << ')';

   return os << s.str();
}

PrevUpHomeNext