_complex.c

来自「stl的源码」· C语言 代码 · 共 146 行

C
146
字号
/* * Copyright (c) 1999 * Silicon Graphics Computer Systems, Inc. * * Copyright (c) 1999 * Boris Fomitchev * * This material is provided "as is", with absolutely no warranty expressed * or implied. Any use is at your own risk. * * Permission to use or copy this software for any purpose is hereby granted * without fee, provided the above notices are retained on all copies. * Permission to modify the code and to distribute modified code is granted, * provided the above notices are retained, and a notice that the code was * modified is included with the above copyright notice. * */#ifndef _STLP_COMPLEX_C#define _STLP_COMPLEX_C#ifndef _STLP_INTERNAL_COMPLEX#  include <stl/_complex.h>#endif#if !defined (_STLP_USE_NO_IOSTREAMS)#  ifndef _STLP_INTERNAL_ISTREAM#    include <stl/_istream.h>#  endif#  ifndef _STLP_INTERNAL_SSTREAM#    include <stl/_sstream.h>#  endif#  ifndef _STLP_STRING_IO_H#    include <stl/_string_io.h>#  endif#endif_STLP_BEGIN_NAMESPACE// Non-inline member functions.template <class _Tp>void complex<_Tp>::_div(const _Tp& __z1_r, const _Tp& __z1_i,                        const _Tp& __z2_r, const _Tp& __z2_i,                        _Tp& __res_r, _Tp& __res_i) {  _Tp __ar = __z2_r >= 0 ? __z2_r : -__z2_r;  _Tp __ai = __z2_i >= 0 ? __z2_i : -__z2_i;  if (__ar <= __ai) {    _Tp __ratio = __z2_r / __z2_i;    _Tp __denom = __z2_i * (1 + __ratio * __ratio);    __res_r = (__z1_r * __ratio + __z1_i) / __denom;    __res_i = (__z1_i * __ratio - __z1_r) / __denom;  }  else {    _Tp __ratio = __z2_i / __z2_r;    _Tp __denom = __z2_r * (1 + __ratio * __ratio);    __res_r = (__z1_r + __z1_i * __ratio) / __denom;    __res_i = (__z1_i - __z1_r * __ratio) / __denom;  }}template <class _Tp>void complex<_Tp>::_div(const _Tp& __z1_r,                        const _Tp& __z2_r, const _Tp& __z2_i,                        _Tp& __res_r, _Tp& __res_i) {  _Tp __ar = __z2_r >= 0 ? __z2_r : -__z2_r;  _Tp __ai = __z2_i >= 0 ? __z2_i : -__z2_i;  if (__ar <= __ai) {    _Tp __ratio = __z2_r / __z2_i;    _Tp __denom = __z2_i * (1 + __ratio * __ratio);    __res_r = (__z1_r * __ratio) / __denom;    __res_i = - __z1_r / __denom;  }  else {    _Tp __ratio = __z2_i / __z2_r;    _Tp __denom = __z2_r * (1 + __ratio * __ratio);    __res_r = __z1_r / __denom;    __res_i = - (__z1_r * __ratio) / __denom;  }}// I/O.#if !defined (_STLP_USE_NO_IOSTREAMS)// Complex output, in the form (re,im).  We use a two-step process// involving stringstream so that we get the padding right.template <class _Tp, class _CharT, class _Traits>basic_ostream<_CharT, _Traits>& _STLP_CALLoperator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __z) {  basic_ostringstream<_CharT, _Traits, allocator<_CharT> > __tmp;  __tmp.flags(__os.flags());  __tmp.imbue(__os.getloc());  __tmp.precision(__os.precision());  __tmp << '(' << __z.real() << ',' << __z.imag() << ')';  return __os << __tmp.str();}// Complex input from arbitrary streams.  Note that results in some// locales may be confusing, since the decimal character varies with// locale and the separator between real and imaginary parts does not.template <class _Tp, class _CharT, class _Traits>basic_istream<_CharT, _Traits>& _STLP_CALLoperator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __z) {  _Tp  __re = 0;  _Tp  __im = 0;  const ctype<_CharT>& __c_type = *__is._M_ctype_facet();  const char __punct[4] = "(,)";  _CharT __wpunct[3];  __c_type.widen(__punct, __punct + 3, __wpunct);  _CharT __c;  __is >> __c;  if (_Traits::eq(__c, __wpunct[0])) {  // Left paren    __is >> __re >> __c;    if (_Traits::eq(__c, __wpunct[1]))  // Comma      __is >> __im >> __c;    if (!_Traits::eq(__c, __wpunct[2])) // Right paren      __is.setstate(ios_base::failbit);  }  else {    __is.putback(__c);    __is >> __re;  }  if (__is)    __z = complex<_Tp>(__re, __im);  return __is;}#endif /* _STLP_USE_NO_IOSTREAMS */_STLP_END_NAMESPACE#endif /* _STLP_COMPLEX_C */// Local Variables:// mode:C++// End:

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?