1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
#!/bin/sh
# $MawkId: fpe_test,v 1.7 2010/12/10 17:00:00 tom Exp $
###############################################################################
# copyright 2009,2010, Thomas E. Dickey
# copyright 2010, Guido Berhoerster
# copyright 1994,1995, Michael D. Brennan
#
# This is a source file for mawk, an implementation of
# the AWK programming language.
#
# Mawk is distributed without warranty under the terms of
# the GNU General Public License, version 2, 1991.
###############################################################################
# tests if mawk has been compiled to correctly handle
# floating point exceptions
#
# @Log: fpe_test,v @
# Revision 1.3 1995/08/29 14:17:18 mike
# exit 2 changes
#
# Revision 1.2 1994/12/18 18:51:55 mike
# recognize NAN printed as ? for hpux
#
PROG="${MAWK:-../mawk}"
PATH=/bin:/usr/bin
export PATH
echo "testing floating point exception handling"
STDOUT=${TMPDIR-/tmp}/mawktest$$
test1='BEGIN{ print 4/0 }'
test2='BEGIN {
x = 100
do { y = x ; x *= 1000 } while ( y != x )
print "loop terminated"
}'
# this used to test log(-8), but that was too challenging for cygwin hackers
test3='BEGIN{ print sqrt(-8) }'
echo "testing division by zero"
echo $PROG "$test1"
$PROG "$test1"
ret1=$?
echo
echo "testing overflow"
echo $PROG "$test2"
$PROG "$test2"
ret2=$?
echo
echo "testing domain error"
echo $PROG "$test3"
$PROG "$test3" > $STDOUT
ret3=$?
cat $STDOUT
echo
# the returns should all be zero or all 2
# core dumps not allowed
trap '
echo compilation defines for floating point are incorrect
rm -f $STDOUT
exit 1' 0
echo
echo ==============================
echo return1 = $ret1
echo return2 = $ret2
echo return3 = $ret3
[ $ret1 -gt 128 ] && { echo test1 failed ; exception=1 ; }
[ $ret2 -gt 128 ] && { echo test2 failed ; exception=1 ; }
[ $ret3 -gt 128 ] && { echo test3 failed ; exception=1 ; }
[ "$exception" = 1 ] && { rm -f *core* $STDOUT ; exit 1 ; }
same=0
[ $ret1 = $ret2 ] && [ $ret2 = $ret3 ] && same=1
if [ $same = 1 ]
then
if [ $ret1 = 0 ]
then
echo "results consistent: ignoring floating exceptions"
# some versions of hpux print NAN as ?
if egrep '[nN][aA][nN]|\?' $STDOUT > /dev/null
then
:
# MSYS / MinGW uses a different string...
elif fgrep '#IND' $STDOUT > /dev/null
then
echo "found MinGW hack for NaN..."
else
echo "but the library is not IEEE754 compatible"
echo "test 3 failed"
exit 1
fi
else echo "results consistent: trapping floating exceptions"
fi
trap 0
rm -f $STDOUT
exit 0
else
cat <<-EOF
results are not consistent
return values should all be 0 if ignoring FPEs (e.g. with IEEE754)
or all 2 if trapping FPEs
EOF
exit 1
fi
|