This repository has been archived on 2024-12-16. You can view files and clone it, but cannot push or open issues or pull requests.
CodeBlocksPortable/WATCOM/samples/goodies/_matherr.for

155 lines
4.9 KiB
Fortran

*
* _MATHERR.FOR : math error handler
*
* Compile: wfc[386] _matherr
*$pragma aux __imath2err "*_" parm( value, reference, reference )
*$pragma aux __amath1err "*_" parm( value, reference )
*$pragma aux __amath2err "*_" parm( value, reference, reference )
*$pragma aux __math1err "*_" parm( value, reference )
*$pragma aux __math2err "*_" parm( value, reference, reference )
*$pragma aux __zmath2err "*_" parm( value, reference, reference )
*$pragma aux __qmath2err "*_" parm( value, reference, reference )
integer function __imath2err( err_info, arg1, arg2 )
integer err_info
integer arg1, arg2
include 'mathcode.fi'
arg1 = arg1 ! to avoid unreferenced warning message
arg2 = arg2 ! to avoid unreferenced warning message
if( ( err_info .and. M_DOMAIN ) .ne. 0 )then
select( err_info .and. FUNC_MASK )
case( FUNC_POW )
print *, 'arg2 cannot be <= 0'
case( FUNC_MOD )
print *, 'arg2 cannot be 0'
end select
end if
__imath2err = 0
end
real function __amath1err( err_info, arg1 )
integer err_info
real arg1
include 'mathcode.fi'
arg1 = arg1 ! to avoid unreferenced warning message
if( ( err_info .and. M_DOMAIN ) .ne. 0 )then
select( err_info .and. FUNC_MASK )
case( FUNC_COTAN )
print *, 'overflow'
end select
end if
__amath1err = 0.0
end
real function __amath2err( err_info, arg1, arg2 )
integer err_info
real arg1, arg2
include 'mathcode.fi'
arg1 = arg1 ! to avoid unreferenced warning message
arg2 = arg2 ! to avoid unreferenced warning message
if( ( err_info .and. M_DOMAIN ) .ne. 0 )then
select( err_info .and. FUNC_MASK )
case( FUNC_MOD )
print *, 'arg2 cannot be 0'
end select
end if
__amath2err = 0.0
end
double precision function __math1err( err_info, arg1 )
integer err_info
double precision arg1, __math2err
__math1err = __math2err( err_info, arg1, arg1 )
end
double precision function __math2err( err_info, arg1, arg2 )
integer err_info
double precision arg1, arg2
include 'mathcode.fi'
arg1 = arg1 ! to avoid unreferenced warning message
arg2 = arg2 ! to avoid unreferenced warning message
if( ( err_info .and. M_DOMAIN ) .ne. 0 )then
select( err_info .and. FUNC_MASK )
case( FUNC_SQRT )
print *, 'argument cannot be negative'
case( FUNC_ASIN, FUNC_ACOS )
print *, 'argument must be less than or equal to one'
case( FUNC_ATAN2 )
print *, 'both arguments must not be zero'
case( FUNC_POW )
if( arg1 .eq. 0.0 )then
print *, 'a zero base cannot be raised to a ',
& 'negative power'
else ! base < 0 and non-integer power
print *, 'a negative base cannot be raised to a ',
& 'non-integral power'
endif
case( FUNC_LOG, FUNC_LOG10 )
print *, 'argument must not be negative'
end select
else if( ( err_info .and. M_SING ) .ne. 0 )then
if( ( ( err_info .and. FUNC_MASK ) .eq. FUNC_LOG ) .or.
& ( ( err_info .and. FUNC_MASK ) .eq. FUNC_LOG10 ) )then
print *, 'argument must not be zero'
endif
else if( ( err_info .and. M_OVERFLOW ) .ne. 0 )then
print *, 'value of argument will cause overflow condition'
else if( ( err_info .and. M_UNDERFLOW ) .ne. 0 )then
print *, 'value of argument will cause underflow ',
& 'condition - return zero'
end if
__math2err = 0
end
complex function __zmath2err( err_info, arg1, arg2 )
integer err_info
complex arg1, arg2
include 'mathcode.fi'
arg1 = arg1 ! to avoid unreferenced warning message
arg2 = arg2 ! to avoid unreferenced warning message
if( ( err_info .and. M_DOMAIN ) .ne. 0 )then
select( err_info .and. FUNC_MASK )
case( FUNC_POW )
! arg1 is (0,0)
if( imag( arg2 ) .ne. 0 )then
print *, 'a zero base cannot be raised to a',
& ' complex power with non-zero imaginary part'
else
print *, 'a zero base cannot be raised to a',
& ' complex power with non-positive real part'
endif
end select
end if
__zmath2err = (0,0)
end
double complex function __qmath2err( err_info, arg1, arg2 )
integer err_info
double complex arg1, arg2
include 'mathcode.fi'
arg1 = arg1 ! to avoid unreferenced warning message
arg2 = arg2 ! to avoid unreferenced warning message
if( ( err_info .and. M_DOMAIN ) .ne. 0 )then
select( err_info .and. FUNC_MASK )
case( FUNC_POW )
! arg1 is (0,0)
if( imag( arg2 ) .ne. 0 )then
print *, 'a zero base cannot be raised to a',
& ' complex power with non-zero imaginary part'
else
print *, 'a zero base cannot be raised to a',
& ' complex power with non-positive real part'
endif
end select
end if
__qmath2err = (0,0)
end