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 + -
显示快捷键?