cmplx01.cpp

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C++ 代码 · 共 572 行 · 第 1/2 页

CPP
572
字号

  z = polar( 1.0, 10.0 );
  if( !close_enough( z, complex( -0.8391, -0.5440 ) ) ) {
    std::cout << "polar FAIL 0006\n"; rc = false;
  }
  return( rc );
}

bool cos_test( )
{
  using std::cos;
  bool rc = true;

  complex i_values[] = {
    complex(  1.0,  1.0 ), complex( -2.0,  1.0 ),
    complex( -1.0, -1.0 ), complex(  1.0, -2.0 ) };

  complex o_values[] = {
    complex( 8.337E-1, -9.889E-1 ), complex( -6.421E-1, 1.069E+0 ),
    complex( 8.337E-1, -9.889E-1 ), complex(  2.033E+0, 3.052E+0 ) };

  for( int i = 0; i < 4; ++i ) {
    if( !close_enough( cos( i_values[i] ), o_values[i] ) ) {
      std::cout << "cos FAIL 0001\n"; rc = false;
    }
  }
  return( rc );
}

bool cosh_test( )
{
  using std::cosh;
  bool rc = true;

  complex i_values[] = {
    complex(  1.0,  1.0 ), complex( -2.0,  1.0 ),
    complex( -1.0, -1.0 ), complex(  1.0, -2.0 ) };

  complex o_values[] = {
    complex( 8.337E-1, 9.889E-1 ), complex(  2.033E+0, -3.052E+0 ),
    complex( 8.337E-1, 9.889E-1 ), complex( -6.421E-1, -1.069E+0 ) };

  for( int i = 0; i < 4; ++i ) {
    if( !close_enough( cosh( i_values[i] ), o_values[i] ) ) {
      std::cout << "cosh FAIL 0001\n"; rc = false;
    }
  }
  return( rc );
}

bool exp_test( )
{
  using std::exp;
  bool rc = true;

  complex i_values[] = {
    complex(  1.0,  1.0 ), complex( -2.0,  1.0 ),
    complex( -1.0, -1.0 ), complex(  1.0, -2.0 ) };

  complex o_values[] = {
    complex( 1.469E+0,  2.287E+0 ), complex(  7.312E-2,  1.139E-1 ),
    complex( 1.988E-1, -3.096E-1 ), complex( -1.131E+0, -2.472E+0 ) };

  for( int i = 0; i < 4; ++i ) {
    if( !close_enough( exp( i_values[i] ), o_values[i] ) ) {
      std::cout << "exp FAIL 0001\n"; rc = false;
    }
  }
  return( rc );
}

bool log_test( )
{
  using std::log;
  bool rc = true;

  complex i_values[] = {
    complex(  1.0,  1.0 ), complex( -2.0,  1.0 ),
    complex( -1.0, -1.0 ), complex(  1.0, -2.0 ),

    // Exercise mag_rp > 32 * mag_ip, etc. Should explore all four quads.
    complex( 100.0, 1.0 ), complex( 1.0, 100.0 ) };

  complex o_values[] = {
    complex( 3.466E-1,  7.854E-1 ), complex(  8.047E-1,  2.678E+0 ),
    complex( 3.466E-1, -2.356E+0 ), complex(  8.047E-1, -1.107E+0 ),
    complex( 4.605E+0,  1.000E-2 ), complex(  4.605E+0,  1.561E+0 ) };

  for( int i = 0; i < 6; ++i ) {
    if( !close_enough( log( i_values[i] ), o_values[i] ) ) {
      std::cout << "log FAIL 0001\n"; rc = false;
    }
  }
  return( rc );
}

bool log10_test( )
{
  using std::log10;
  bool rc = true;

  complex i_values[] = {
    complex(  1.0,  1.0 ), complex( -2.0,  1.0 ),
    complex( -1.0, -1.0 ), complex(  1.0, -2.0 ),

    // Exercise mag_rp > 32 * mag_ip, etc. Should explore all four quads.
    complex( 100.0, 1.0 ), complex( 1.0, 100.0 ) };

  complex o_values[] = {
    complex( 1.505E-1,  3.411E-1 ), complex(  3.495E-1,  1.163E+0 ),
    complex( 1.505E-1, -1.023E+0 ), complex(  3.495E-1, -4.808E-1 ),
    complex( 2.000E+0,  4.343E-3 ), complex(  2.000E+0,  6.778E-1 ) };

  for( int i = 0; i < 6; ++i ) {
    if( !close_enough( log10( i_values[i] ), o_values[i] ) ) {
      std::cout << "log10 FAIL 0001\n"; rc = false;
    }
  }
  return( rc );
}

bool pow_test( )
{
  using std::pow;
  bool rc = true;

  // This testing is minimal. At least it instantiates all three templates.

  complex z = pow( complex( -1.0, 1.0 ), 3 );
  if( !close_enough( complex( 2.0, 2.0 ), z ) ) {
    std::cout << "pow FAIL 0001\n"; rc = false;
  }

  z = pow( complex( -2.0, -1.0 ), 2.5 );
  if( !close_enough( complex( 6.852E+0, -2.992E+0 ), z ) ) {
    std::cout << "pow FAIL 0002\n"; rc = false;
  }

  z = pow( complex( 1.0, -2.0 ), complex( 3.0, -0.5 ) );
  if( !close_enough( complex( -5.369E+0, 3.534E+0 ), z ) ) {
    std::cout << "pow FAIL 0003\n"; rc = false;
  }

  z = pow( 4.2, complex( 1.5, 2.0 ) );
  if( !close_enough( complex( -8.292E+0, 2.308E+0 ), z ) ) {
    std::cout << "pow FAIL 0004\n"; rc = false;
  }
  return( rc );
}

bool sin_test( )
{
  using std::sin;
  bool rc = true;

  complex i_values[] = {
    complex(  1.0,  1.0 ), complex( -2.0,  1.0 ),
    complex( -1.0, -1.0 ), complex(  1.0, -2.0 ) };

  complex o_values[] = {
    complex(  1.298E+0,  6.350E-1 ), complex( -1.403E+0, -4.891E-1 ),
    complex( -1.298E+0, -6.350E-1 ), complex(  3.166E+0, -1.960E+0 ) };

  for( int i = 0; i < 4; ++i ) {
    if( !close_enough( sin( i_values[i] ), o_values[i] ) ) {
      std::cout << "sin FAIL 0001\n"; rc = false;
    }
  }
  return( rc );
}

bool sinh_test( )
{
  using std::sinh;
  bool rc = true;

  complex i_values[] = {
    complex(  1.0,  1.0 ), complex( -2.0,  1.0 ),
    complex( -1.0, -1.0 ), complex(  1.0, -2.0 ) };

  complex o_values[] = {
    complex(  6.350E-1,  1.298E+0 ), complex( -1.960E+0,  3.166E+0 ),
    complex( -6.350E-1, -1.298E+0 ), complex( -4.891E-1, -1.403E+0 ) };

  for( int i = 0; i < 4; ++i ) {
    if( !close_enough( sinh( i_values[i] ), o_values[i] ) ) {
      std::cout << "sinh FAIL 0001\n"; rc = false;
    }
  }
  return( rc );
}

bool sqrt_test( )
{
  using std::sqrt;
  bool rc = true;

  complex i_values[] = {
    complex(  1.0,  1.0 ), complex( -2.0,  1.0 ),
    complex( -1.0, -1.0 ), complex(  1.0, -2.0 ) };

  complex o_values[] = {
    complex(  1.099E-0,  4.551E-1 ), complex( 3.436E-1,  1.455E+0 ),
    complex(  4.551E-1, -1.099E+0 ), complex( 1.272E+0, -7.862E-1 ) };

  for( int i = 0; i < 4; ++i ) {
    if( !close_enough( sqrt( i_values[i] ), o_values[i] ) ) {
      std::cout << "sqrt FAIL 0001\n"; rc = false;
    }
  }
  return( rc );
}

bool tan_test( )
{
  using std::tan;
  bool rc = true;

  complex i_values[] = {
    complex(  1.0,  1.0 ), complex( -2.0,  1.0 ),
    complex( -1.0, -1.0 ), complex(  1.0, -2.0 ) };

  complex o_values[] = {
    complex(  2.718E-1,  1.084E+0 ), complex( 2.435E-1,  1.167E+0 ),
    complex( -2.718E-1, -1.084E+0 ), complex( 3.381E-2, -1.015E+0 ) };

  for( int i = 0; i < 4; ++i ) {
    if( !close_enough( tan( i_values[i] ), o_values[i] ) ) {
      std::cout << "tan FAIL 0001\n"; rc = false;
    }
  }
  return( rc );
}

bool tanh_test( )
{
  using std::tanh;
  bool rc = true;

  complex i_values[] = {
    complex(  1.0,  1.0 ), complex( -2.0,  1.0 ),
    complex( -1.0, -1.0 ), complex(  1.0, -2.0 ) };

  complex o_values[] = {
    complex(  1.084E+0,  2.718E-1 ), complex( -1.015E+0,  3.381E-2 ),
    complex( -1.084E+0, -2.718E-1 ), complex(  1.167E+0,  2.435E-1 ) };

  for( int i = 0; i < 4; ++i ) {
    if( !close_enough( tanh( i_values[i] ), o_values[i] ) ) {
      std::cout << "tanh FAIL 0001\n"; rc = false;
    }
  }
  return( rc );
}

int main( )
{
  int rc = 0;
  try {
    if( !construct_test( )   ) rc = 1;
    if( !add_test( )         ) rc = 1;
    if( !subtract_test( )    ) rc = 1;
    if( !multiply_test( )    ) rc = 1;
    if( !divide_test( )      ) rc = 1;
    if( !abs_test( )         ) rc = 1;
    if( !arg_test( )         ) rc = 1;
    if( !polar_test( )       ) rc = 1;
    if( !cos_test( )         ) rc = 1;
    if( !cosh_test( )        ) rc = 1;
    if( !exp_test( )         ) rc = 1;
    if( !log10_test( )       ) rc = 1;
    if( !pow_test( )         ) rc = 1;
    if( !sin_test( )         ) rc = 1;
    if( !sinh_test( )        ) rc = 1;
    if( !sqrt_test( )        ) rc = 1;
    if( !tan_test( )         ) rc = 1;
    if( !tanh_test( )        ) rc = 1;
  }
  catch( ... ) {
    std::cout << "Unexpected exception of unexpected type.\n";
    rc = 1;
  }

  return( rc );
}

⌨️ 快捷键说明

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