12aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/** @file 22aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Every thing you wanted to know about your compiler but didn't know whom to ask. 32aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 42aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm COPYRIGHT(c) 1993-9 Steven Pemberton, CWI. All rights reserved. 52aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Steven Pemberton, CWI, Amsterdam; "Steven.Pemberton@cwi.nl" 62aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Used with permission. 72aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 82aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR> 92aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm This program and the accompanying materials 102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm are licensed and made available under the terms and conditions of the BSD License 112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm which accompanies this distribution. The full text of the license may be found at 122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm http://opensource.org/licenses/bsd-license. 132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm**/ 172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#if defined(_MSC_VER) /* Handle Microsoft VC++ compiler specifics. */ 182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm #pragma warning ( disable : 4018 ) 192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm #pragma warning ( disable : 4055 ) 202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm #pragma warning ( disable : 4116 ) 212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm #pragma warning ( disable : 4130 ) 222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm #pragma warning ( disable : 4189 ) 232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm #pragma warning ( disable : 4244 ) 242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm #pragma warning ( disable : 4723 ) 252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* defined(_MSC_VER) */ 262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#define NO_SC 1 // Compiler doesn't support signed char 282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#define NO_UC 1 // Compiler doesn't support unsigned char 292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#define NO_UI 1 // Compiler doesn't support unsigned short and long 302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#define NO_VOID 1 // Compiler doesn't support void 312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#define NO_SIG 1 // Compiler doesn't support signal() or setjmp/longjmp() 322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Some compilers can't cope with "#ifdef __FILE__". Use 342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm either the FILENAME or BAD_CPP macro as described below. 352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/ 362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* If your C preprocessor doesn't have the predefined __FILE__ 372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmmacro, and you don't want to call this file enquire.c but, say, 382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmtell.c, uncomment the following and change enquire.c to tell.c. 392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/ 402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#define FILENAME "enquire.c" 412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Some compilers won't accept the line "#include FILENAME". Uncomment 432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm the following macro. In that case, this file *must* be called enquire.c. 442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/ 452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#define BAD_CPP 1 462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Some naughty compilers define __STDC__, but don't really 482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm support it. Some define it as 0, in which case we ignore it. 492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm But if your compiler defines it, and isn't really ANSI C, 502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm uncomment the BAD_STDC macro. (To those compiler writers: for shame). 512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/ 522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#define BAD_STDC 1 532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Some naughty compilers define __STDC__, but don't have the 552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm stddef.h include file. Uncomment the BAD_STDDEF macro. (Gcc needs this on 562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm some machines, due to clashes between stddef.h and other include files.) 572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/ 582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#define BAD_STDDEF 1 592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Some systems crash when you try to malloc all store. To save users of such 612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm defective systems too much grief, they may uncomment the BAD_MALLOC macro, 622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm which ignores that bit of the code. 632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/ 642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#define BAD_MALLOC 1 652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef PROGRAM 692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define PROGRAM enquire.c 702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define VERSION "5.1a" 712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define PURPOSE Everything you wanted to know about your machine and C compiler 722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define BUT didnt know who to ask 732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define FOR Any OS, any C compiler 742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define AUTHOR Steven Pemberton, CWI, Amsterdam; "Steven.Pemberton@cwi.nl" 752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define COPYRIGHT(c) 1993-9 Steven Pemberton, CWI. All rights reserved. 762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define NOTE Improvements gratefully received. Please mention the version. 772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define COMPILE On Unix compile with: "sh enquire.c"; see below for details 782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define WEB "http://www.cwi.nl/~steven/enquire.html" 792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef NOTDEFINED /* This is how you compile it; see below for details */ 822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case $0 in 832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm *.c) ;; 842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm sh) echo 'Use "sh enquire.c", not "sh < enquire.c"' >&2; exit 1;; 852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm *) echo 'Filename must end in ".c"' >&2; exit 1;; 862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm esac 872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if test -r test.c 882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm then echo Would overwrite test.c - try it somewhere safer >&2; exit 1 892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fi 902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm CFLAGS= 912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm echo Testing for needed CFLAGS ... 922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm echo "main(){char c; c=0;}" > test.c 932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if ${CC=cc} ${1+"$@"} -o enquire test.c $LIBS 942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm then : 952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm else 962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm echo '*** "'$CC ${1+"$@"} -o enquire test.c $LIBS'" failed' 972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm echo '*** Giving up' 982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /bin/rm -f test.c 992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm exit 1 1002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fi 1012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm echo "main(){signed char c; c=0;}" > test.c 1022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if $CC ${1+"$@"} -o enquire test.c $LIBS 2>/dev/null 1032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm then echo " Signed char ok" 1042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm else 1052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm CFLAGS=-DNO_SC 1062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm echo " Signed char not accepted; using $CFLAGS" 1072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fi 1082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm echo "main(){unsigned char c; c=0;}" > test.c 1092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if $CC ${1+"$@"} -o enquire test.c $LIBS 2>/dev/null 1102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm then echo " Unsigned char ok" 1112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm else 1122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm CFLAGS="$CFLAGS -DNO_UC" 1132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm echo " Unsigned char not accepted; using $CFLAGS" 1142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fi 1152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm echo "main(){unsigned short s;unsigned long l;s=0;l=0;}" > test.c 1162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if $CC ${1+"$@"} -o enquire test.c $LIBS 2>/dev/null 1172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm then echo " Unsigned short and long ok" 1182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm else 1192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm CFLAGS="$CFLAGS -DNO_UI" 1202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm echo " Unsigned short or long not accepted; using $CFLAGS" 1212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fi 1222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm echo "void foo(){} main(){foo();}" > test.c 1232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if $CC ${1+"$@"} -o enquire test.c $LIBS 2>/dev/null 1242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm then echo " Void ok" 1252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm else 1262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm CFLAGS="$CFLAGS -DNO_VOID" 1272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm echo " Void not accepted; using $CFLAGS" 1282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fi 1292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /bin/rm -f test.c a.out 1302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 1312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm echo Compiling $0 ... 1322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case $# in 1332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 0) : check bug in interpreting "$@" in some shells, if no parameters 1342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case `echo 1 "$@" 2` in 1352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm "1 2") echo ' *** There is a bug in your shell expanding "$@"!' 1362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm echo ' *** Taking remedial action' ;; 1372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm "1 2") ;; 1382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm esac 1392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm esac 1402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case $ID in 1412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm "") echo " $CC" $CFLAGS "$@" $0 -o enquire $LIBS 1422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm $CC $CFLAGS ${1+"$@"} $0 -o enquire $LIBS || 1432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm { echo '***' Try setting some CFLAGS; exit 1; } 1442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ;; 1452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm *) echo " $CC" $CFLAGS "$@" -DID="\"$ID\"" $0 -o enquire $LIBS 1462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm $CC $CFLAGS ${1+"$@"} -DID="\"$ID\"" $0 -o enquire $LIBS || 1472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm { echo '***' Try setting some CFLAGS; exit 1; } 1482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm esac 1492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm echo "Producing enquire.out limits.h and float.h ..." 1502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm echo " enquire > enquire.out" 1512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ./enquire > enquire.out || echo ' *** Some problems: see enquire.out' 1522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm echo " enquire -l > limits.h" 1532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ./enquire -l > limits.h || echo ' *** Some problems: see limits.h' 1542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm echo " enquire -f > float.h" 1552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ./enquire -f > float.h || echo ' *** Some problems: see float.h' 1562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm echo "Verifying the contents of limits.h and float.h ..." 1572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm echo " $CC" -DVERIFY $CFLAGS "$@" $0 -o verify $LIBS 1582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm $CC -DVERIFY $CFLAGS ${@+"$@"} $0 -o verify $LIBS || 1592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm { echo '***' Failed; exit 1; } 1602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm echo " verify -fl > verify.out" 1612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ./verify -fl > verify.out || 1622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm echo ' *** Some problems: see verify.out' 1632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm echo Done 1642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm exit 0 1652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 1662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 1672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* 1682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm PURPOSE 1692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm This is a program that determines many properties of the C 1702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm compiler and machine that it is run on, such as minimum and 1712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm maximum [un]signed char/int/long, many properties of float/ [long] 1722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm double, and so on. 1732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 1742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm As an option it produces the ANSI C float.h and limits.h files. 1752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 1762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm As a further option, it even checks that the compiler reads the 1772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm header files correctly. 1782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 1792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm It is a good test-case for compilers, since it exercises them with 1802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm many limiting values, such as the minimum and maximum floating-point 1812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm numbers. 1822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 1832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm COMPILING AND RUNNING ON UNIX MACHINES 1842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm With luck and a following wind, on Unix systems just the following 1852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm will work: 1862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm sh enquire.c (or whatever filename you chose). 1872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Any parameters are passed to the C compiler, so if the compilation 1882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fails for any reason curable as explained below, you can do the following: 1892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm sh enquire.c -DBAD_CPP 1902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 1912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm If you do get compilation errors, check the line in question. 1922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Very often there is a comment attached saying which define to set. 1932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 1942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm You can use a different C compiler than the default cc by setting CC: 1952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm CC=gcc sh enquire.c -ansi 1962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm You can load extra libraries by setting LIBS: 1972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm CC=gcc LIBS=-lflong sh enquire.c -ansi 1982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Add ID="string" for the string to be added to the output; for instance: 1992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ID="`hostname` cc -ansi" sh enquire.c -ansi 2002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 2012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Compiling may give messages about unreachable code. These you can ignore. 2022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 2032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Some compilers offer various flags for different floating point 2042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm modes; it's worth trying all possible combinations of these. 2052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 2062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Don't say I haven't tried to make life easy for you... 2072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 2082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm COMPILING AND RUNNING ON NON-UNIX SYSTEMS 2092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm On non-Unix systems, you must say (the equivalent of): 2102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm cc enquire.c -o enquire 2112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm enquire > enquire.out 2122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm enquire -l > limits.h 2132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm enquire -f > float.h 2142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm cc -DVERIFY enquire.c -o verify #this includes limits.h and float.h 2152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm verify -fl > verify.out 2162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 2172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm If your compiler doesn't support: add flag: 2182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm signed char (eg pcc) -DNO_SC 2192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm unsigned char -DNO_UC 2202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm unsigned short and long -DNO_UI 2212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm void -DNO_VOID 2222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm signal(), or setjmp/longjmp() -DNO_SIG 2232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 2242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Try to compile first with no flags, and see if you get any errors 2252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm - you might be surprised. (Most non-ANSI compilers need -DNO_SC, 2262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm though.) Some compilers need a -f flag for floating point. 2272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 2282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Don't use any optimisation flags: the program may not work if you 2292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm do. Though "while (a+1.0-a-1.0 == 0.0)" may look like "while(1)" 2302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm to an optimiser, to a floating-point unit there's a world of difference. 2312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 2322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Compiling may give messages about unreachable code. These you can ignore. 2332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 2342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Some compilers offer various flags for different floating point 2352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm modes; it's worth trying all possible combinations of these. 2362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 2372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm FAULTY COMPILERS 2382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Because of bugs and/or inadequacies, some compilers need the following 2392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm defines: 2402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 2412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm - If your C preprocessor doesn't have the predefined __FILE__ 2422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm macro, and you don't want to call this file enquire.c but, say, 2432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm tell.c, add the flag -DFILENAME=\"tell.c\" . 2442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 2452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm - Some compilers won't accept the line "#include FILENAME". Add 2462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm flag -DBAD_CPP. In that case, this file *must* be called 2472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm enquire.c. 2482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 2492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm - Some compilers can't cope with "#ifdef __FILE__". Use 2502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm -DFILENAME= or -DBAD_CPP as above. 2512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 2522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm - Some naughty compilers define __STDC__, but don't really 2532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm support it. Some define it as 0, in which case we ignore it. 2542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm But if your compiler defines it, and isn't really ANSI C, add 2552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm flag -DBAD_STDC. (To those compiler writers: for shame). 2562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 2572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm - Some naughty compilers define __STDC__, but don't have the 2582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm stddef.h include file. Add flag -DBAD_STDDEF. (Gcc needs this 2592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm on some machines, due to clashes between stddef.h and other 2602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm include files.) 2612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 2622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm - Some systems crash when you try to malloc all store. To save 2632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm users of such defective systems too much grief, they may 2642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm compile with -DBAD_MALLOC, which ignores that bit of the code. 2652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 2662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Summary of naughty-compiler flags: 2672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm If your compiler doesn't support: add flag: 2682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm __FILE__ (and you changed the filename) -DFILENAME=\"name.c\" 2692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm #ifdef __FILE__ -DBAD_CPP or -DFILENAME=... 2702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm #include FILENAME -DBAD_CPP 2712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm __STDC__ (properly) -DBAD_STDC 2722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm stddef.h -DBAD_STDDEF 2732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm malloc(LOTS) == NULL -DBAD_MALLOC 2742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 2752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm While it is not our policy to support defective compilers, pity has been 2762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm taken on people with compilers that can't produce object files bigger than 2772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 32k (especially since it was an easy addition). Compile the program 2782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm into separate parts like this: 2792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm cc -c -DSEP -DPASS0 -o p0.o <other flags> enquire.c 2802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm cc -c -DSEP -DPASS1 -o p1.o <other flags> enquire.c 2812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm cc -c -DSEP -DPASS2 -o p2.o <other flags> enquire.c 2822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm cc -c -DSEP -DPASS3 -o p3.o <other flags> enquire.c 2832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm cc -o enquire p0.o p1.o p2.o p3.o 2842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 2852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm SYSTEM DEPENDENCIES 2862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm You may possibly need to add some calls to signal() for other sorts of 2872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm exception on your machine than SIGFPE, SIGOVER, SIGBUS, and SIGSEGV. 2882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm See lines beginning #ifdef SIGxxx (and communicate the differences to me!). 2892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 2902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm OUTPUT 2912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Running without argument gives the information as English text. If run 2922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm with argument -l (e.g. enquire -l), output is a series of #define's for 2932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm the ANSI standard limits.h include file, excluding MB_MAX_CHAR. If run 2942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm with argument -f, output is a series of #define's for the ANSI standard 2952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm float.h include file (according to ANSI C Draft of Dec 7, 1988). 2962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Flag -v gives verbose output: output includes the English text above 2972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm as C comments. The program exit(0)'s if everything went ok, otherwise 2982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm it exits with a positive number, telling how many problems there were. 2992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 3002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm VERIFYING THE COMPILER 3012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm If, having produced the float.h and limits.h header files, you want to 3022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm verify that the compiler reads them back correctly (there are a lot of 3032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm boundary cases, of course, like minimum and maximum numbers), you can 3042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm recompile enquire.c with -DVERIFY set (plus the other flags that you used 3052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm when compiling the version that produced the header files). This then 3062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm recompiles the program so that it #includes "limits.h" and "float.h", 3072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm and checks that the constants it finds there are the same as the 3082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm constants it produces. Run the resulting program with enquire -fl. 3092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Many compilers fail this test. 3102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm NB: You *must* recompile with the same compiler and flags, otherwise 3112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm you may get odd results. 3122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 3132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm You can also use this option if your compiler already has both files, 3142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm and you want to confirm that this program produces the right results. 3152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 3162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm TROUBLESHOOTING. 3172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm This program is now quite trustworthy, and suspicious and wrong output 3182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm may well be caused by bugs in the compiler, not in the program (however 3192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm of course, this is not guaranteed, and no responsibility can be 3202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm accepted, etc.) 3212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 3222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm The program only works if overflows are ignored by the C system or 3232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm are catchable with signal(). 3242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 3252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm If the program fails to run to completion (often with the error message 3262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm "Unexpected signal at point x"), this often turns out to be a bug in the 3272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm C compiler's run-time system. Check what was about to be printed, and 3282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm try to narrow the problem down. 3292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 3302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Another possible problem is that you have compiled the program to produce 3312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm loss-of-precision arithmetic traps. The program cannot cope with these, 3322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm and you should re-compile without them. (They should never be the default). 3332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 3342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Make sure you compiled with optimisation turned off. 3352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 3362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Output preceded by *** WARNING: identifies behaviour of the C system 3372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm deemed incorrect by the program. Likely problems are that printf or 3382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm scanf don't cope properly with certain boundary numbers: this program 3392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm goes to a lot of trouble to calculate its values, and these values 3402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm are mostly boundary numbers. Experience has shown that often printf 3412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm cannot cope with these values, and so in an attempt to increase 3422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm confidence in the output, for each float and double that is printed, 3432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm the printed value is checked by using sscanf to read it back. 3442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Care is taken that numbers are printed with enough digits to uniquely 3452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm identify them, and therefore that they can be read back identically. 3462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm If the number read back is different, then there is probably a bug in 3472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf or sscanf, and the program prints the warning message. 3482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm If the two numbers in the warning look identical, then printf is more 3492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm than likely rounding the last digit(s) incorrectly. To put you at ease 3502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm that the two really are different, the bit patterns of the two numbers 3512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm are also printed. The difference is very likely in the last bit. 3522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Many scanf's read the minimum double back as 0.0, and similarly cause 3532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm overflow when reading the maximum double. This program quite ruthlessly 3542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm declares all these behaviours faulty. The point is that if you get 3552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm one of these warnings, the output may be wrong, so you should check 3562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm the result carefully if you intend to use the results. Of course, printf 3572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm and sscanf may both be wrong, and cancel each other out, so you should 3582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm check the output carefully anyway. 3592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 3602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm The warning that "a cast didn't work" refers to cases like this: 3612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 3622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm float f; 3632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm #define C 1.234567890123456789 3642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f= C; 3652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (f != (float) C) printf ("Wrong!"); 3662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 3672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm A faulty compiler will widen f to double and ignore the cast to float, 3682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm and because there is more accuracy in a double than a float, fail to 3692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm recognise that they are the same. In the actual case in point, f and C 3702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm are passed as parameters to a function that discovers they are not equal, 3712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm so it's just possible that the error was in the parameter passing, 3722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm not in the cast (see function Verify()). 3732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm For ANSI C, which has float constants, the error message is "constant has 3742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm wrong precision". 3752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 3762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm REPORTING PROBLEMS 3772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm If the program doesn't work for you for any reason that can't be 3782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm narrowed down to a problem in the C compiler, or it has to be 3792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm changed in order to get it to compile, or it produces suspicious 3802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm output (like a very low maximum float, for instance), please mail 3812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm the problem and an example of the incorrect output to 3822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Steven.Pemberton@cwi.nl so that improvements can be worked into 3832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm future versions. Try to give as much information as possible; 3842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm DON'T FORGET TO MENTION THE VERSION NUMBER! 3852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 3862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm The program tries to catch and diagnose bugs in the compiler/run-time 3872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm system. I would be especially pleased to have reports of failures so 3882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm that I can improve this service. 3892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 3902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm I apologise unreservedly for the contorted use of the preprocessor... 3912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm but it was fun! 3922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 3932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm NEW VERSIONS 3942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Worried that you may not have the latest version? Ftp to 3952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ftp.cwi.nl, and look in directory pub/steven/enquire 3962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm for file enquireXX.c; XX is the version number. Or look at 3972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm http://www.cwi.nl/~steven/enquire.html 3982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 3992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm HOW DOES ENQUIRE WORK? 4002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm There is an article that explains a lot of the workings: The 4012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Ergonomics of Portability; available from the above addresses as file 4022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm enquire.ps. 4032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 4042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm THE SMALL PRINT 4052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm This is not a public domain program; nor is any other program that 4062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm carries a copyright notice. It is however freely copyable under the 4072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm following conditions: 4082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 4092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm You may copy and distribute verbatim copies of this source file. 4102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm You may modify this source file, and copy and distribute such 4112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm modified versions, provided that you leave the copyright notice 4122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm at the top of the file and also cause the modified file to carry 4132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm prominent notices stating that you changed the files and the 4142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm date of any change; and cause the whole of any work that you 4152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm distribute or publish, that in whole or in part contains or is a 4162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm derivative of this program or any part thereof, to be licensed 4172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm at no charge to all third parties on terms identical to those 4182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm here. 4192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 4202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm While every effort has been taken to make this program as reliable as 4212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm possible, no responsibility can be taken for the correctness of the 4222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm output, nor suitability for any particular use. 4232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 4242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm If you do have a fix to any problem, please send it to me, so that 4252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm other people can have the benefits. 4262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 4272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm This program is an offshoot of a project funded by public funds. 4282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm If you use this program for research or commercial use (i.e. more 4292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm than just for the fun of knowing about your compiler) mailing a short 4302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm note of acknowledgement may help keep enquire.c supported. 4312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 4322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ACKNOWLEDGEMENTS 4332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Many people have given time and ideas to making this program what it is. 4342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm To all of them thanks, and apologies for not mentioning them by name. 4352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 4362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm HISTORY 4372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Originally started as a program to generate configuration constants 4382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm for a large piece of software we were writing, which later took on 4392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm a life of its own... 4402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 1.0 Length 6658!; end 1984? 4412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unix only. Only printed a dozen maximum int/double values. 4422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 2.0 Length 10535; Spring 1985 4432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Prints values as #defines (about 20 of them) 4442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm More extensive floating point, using Cody and Waite 4452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Handles signals better 4462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Programs around optimisations 4472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Handles Cybers 4482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 3.0 Length 12648; Aug 1987; prints about 42 values 4492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Added PASS stuff, so treats float as well as double 4502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 4.0 Length 33891; Feb 1989; prints around 85 values 4512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm First GNU version (for gcc, where they called it hard-params.c) 4522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Generates float.h and limits.h files 4532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Handles long double 4542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Generates warnings for dubious output 4552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 4.1 Length 47738; April 1989 4562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Added VERIFY and TEST 4572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 4.2 Length 63442; Feb 1990 4582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Added SEP 4592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Fixed eps/epsneg 4602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Added check for pseudo-unsigned chars 4612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Added description for each #define output 4622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Added check for absence of defines during verify 4632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Added prototypes 4642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Added BAD_STDC and BAD_CPP 4652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Fixed alignments output 4662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 4.3 Length 75000; Oct 1990; around 114 lines of output 4672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Function xmalloc defined, Richard Stallman, June 89. 4682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Alignments computed from member offsets rather than structure sizes, 4692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Richard Stallman, Oct 89 4702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Print whether char* and int* pointers have the same format; 4712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm also char * and function * 4722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Update to Draft C version Dec 7, 1988 4732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm - types of constants produced in limits.h 4742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (whether to put a U after unsigned shorts and chars and 4752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm whether to output -1024 as (-1023-1)) 4762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm - values of SCHAR_MIN/MAX 4772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm - values of *_EPSILON (not the smallest but the effective smallest) 4782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Added FILENAME, since ANSI C doesn't allow #define __FILE__ 4792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Renamed from config.c to enquire.c 4802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Added size_t and ptrdiff_t enquiries 4812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Added promotion enquiries 4822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Added type checks of #defines 4832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Added BAD_STDDEF 4842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Changed endian to allow for cases where not all bits are used 4852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Sanity check for max integrals 4862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Fixed definition of setjmp for -DNO_SIG 4872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Moved #define ... 0.0L inside #ifdef STDC, in case some cpp's tokenize 4882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Added BAD_MALLOC 4892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 5.0 Length 88228; February 1993; around 120 lines of output 4902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (depends on what you count) 4912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Added the 'sh enquire.c' horror/delight: thanks David Mankins@think 4922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Added checks for long names: thanks Steve Simon@leeds-poly 4932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Added FPE signal checks: thanks Leonid A. Broukhis 4942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Added check for dereferencing NULL 4952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Added TESTI 4962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Added LIBS, fixed showtype: thanks Rainer Orth@TechFak.Uni-Bielefeld.DE 4972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Added a free(): thanks nickc@perihelion.co.uk 4982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Added signal catching to the malloc part 4992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Renamed naughty-compiler defines to BAD_* 5002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Renamed and altered Verify() to better check faulty compilers 5012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Shut some compilers up from giving incorrect warnings. 5022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Fixed sign_of(): thanks Hugh Redelmeier@redvax 5032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Fixed USHRT_MAX for sizeof(short)=sizeof(int) but INT_MAX > SHRT_MAX 5042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Fixed NO_UI 5052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Fixed -DSEP: thanks Mike Black@seismo 5062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Fixed the case where stdio.h includes limits.h: thanks rms@gnu 5072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Fixed exponent(): thanks Christophe BINOT 5082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm <chb%hpvpta.france.hp.com@hplb.hpl.hp.com> 5092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 5.0a Aug 1997 5102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Made handling of ID= easier 5112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Improved the reporting of use of bits in Floating values. 5122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 5.1 Length 88739; Sep 1998 5132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Fixed detection of infinity for machines with no overflow trap 5142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Speeded up search for max char (first 32 bit char machine turned up...) 5152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 5.1a Length 88832; Feb 1999 5162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Changed identification message 5172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 5.1b Length 88926; Oct 2002 5182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Fixed a missing \n in an output line; thanks Leonid Broukhis again 5192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/ 5202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 5212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Set FILENAME to the name of this file */ 5222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef FILENAME 5232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef BAD_CPP 5242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define FILENAME "enquire.c" 5252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 5262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef __FILE__ /* It's a compiler bug if this fails. Define BAD_CPP */ 5272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define FILENAME __FILE__ 5282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 5292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define FILENAME "enquire.c" 5302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* __FILE__ */ 5312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* BAD_CPP */ 5322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* FILENAME */ 5332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 5342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* This file is read three times (it #includes itself), to generate 5352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm otherwise identical code for each of short+float, int+double, 5362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm long+long double. If PASS isn't defined, then this is the first pass. 5372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Code bracketed by 'PASS0' is for stuff independent of all three, 5382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm but is read during the first pass. 5392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/ 5402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef PASS 5412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SEP /* so we're only interested if this is pass 1 or not */ 5422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef PASS1 5432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define PASS 1 5442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 5452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define PASS 0 5462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 5472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else /* no SEP, so this is the first pass */ 5482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define PASS 1 5492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define PASS0 1 5502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define PASS1 1 5512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* SEP */ 5522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 5532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Void just marks the functions that don't return a result */ 5542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef NO_VOID 5552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Void int 5562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 5572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Void void 5582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 5592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 5602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Set STDC to whether this is *really* an ANSI C compiler. 5612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Some bad compilers define __STDC__, when they don't support it. 5622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Compile with -DBAD_STDC to get round this. 5632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/ 5642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef BAD_STDC 5652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef __STDC__ 5662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#if __STDC__ /* If __STDC__ is 0, assume it isn't supported */ 5672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define STDC 5682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 5692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 5702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 5712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 5722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Stuff different for ANSI C, and old C: 5732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ARGS and NOARGS are used for function prototypes. 5742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Volatile is used to reduce the chance of optimisation, 5752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm and to prevent variables being put in registers (when setjmp/longjmp 5762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm wouldn't work as we want) 5772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Long_double is the longest floating point type available. 5782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm stdc is used in tests like "if (stdc)", which is less ugly than #ifdef. 5792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm U is output after unsigned constants. 5802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm */ 5812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef STDC 5822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 5832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ARGS(x) x 5842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define NOARGS (void) 5852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Volatile volatile 5862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Long_double long double 5872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define stdc 1 5882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define U "U" 5892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 5902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else /* Old style C */ 5912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 5922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ARGS(x) () 5932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define NOARGS () 5942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Volatile static 5952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Long_double double 5962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define stdc 0 5972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define U "" 5982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 5992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* STDC */ 6002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 6012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* include files */ 6022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#include <stdio.h> 6032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#include <wchar.h> 6042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 6052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef STDC 6062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef BAD_STDDEF 6072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#include <stddef.h> /* for size_t: if this fails, define BAD_STDDEF */ 6082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 6092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 6102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 6112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef NO_SIG 6122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define jmp_buf int 6132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 6142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#include <signal.h> /* if this fails, define NO_SIG */ 6152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#include <setjmp.h> /* if this fails, define NO_SIG */ 6162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 6172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#ifndef NO_SIG 6182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#include <signal.h> /* if this fails, define NO_SIG */ 6192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#include <setjmp.h> /* if this fails, define NO_SIG */ 6202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm//#endif 6212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 6222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Kludge around the possiblity that <stdio.h> includes <limits.h> */ 6232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef CHAR_BIT 6242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef CHAR_BIT 6252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef CHAR_MAX 6262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef CHAR_MIN 6272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef SCHAR_MAX 6282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef SCHAR_MIN 6292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef UCHAR_MAX 6302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef UCHAR_MIN 6312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 6322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 6332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef VERIFY 6342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#include "limits.h" 6352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#include "float.h" 6362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 6372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 6382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* The largest unsigned type */ 6392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef NO_UI 6402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ulong unsigned int 6412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 6422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ulong unsigned long 6432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 6442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 6452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Some shorthands */ 6462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Vprintf if (V) printf 6472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Unexpected(place) if (setjmp(lab)!=0) croak(place) 6482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define fabs(x) (((x)<0.0)?(-x):(x)) 6492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 6502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* PASS */ 6512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 6522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* A description of the ANSI constants */ 6532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_CHAR_BIT "Number of bits in a storage unit" 6542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_CHAR_MAX "Maximum char" 6552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_CHAR_MIN "Minimum char" 6562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_SCHAR_MAX "Maximum signed char" 6572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_SCHAR_MIN "Minimum signed char" 6582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_UCHAR_MAX "Maximum unsigned char (minimum is always 0)" 6592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 6602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_INT_MAX "Maximum %s" 6612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_INT_MIN "Minimum %s" 6622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_UINT_MAX "Maximum unsigned %s (minimum is always 0)" 6632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 6642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_FLT_ROUNDS "Addition rounds to 0: zero, 1: nearest, 2: +inf, 3: -inf, -1: unknown" 6652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_FLT_RADIX "Radix of exponent representation" 6662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_MANT_DIG "Number of base-FLT_RADIX digits in the significand of a %s" 6672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_DIG "Number of decimal digits of precision in a %s" 6682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_MIN_EXP "Minimum int x such that FLT_RADIX**(x-1) is a normalised %s" 6692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_MIN_10_EXP "Minimum int x such that 10**x is a normalised %s" 6702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_MAX_EXP "Maximum int x such that FLT_RADIX**(x-1) is a representable %s" 6712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_MAX_10_EXP "Maximum int x such that 10**x is a representable %s" 6722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_MAX "Maximum %s" 6732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_EPSILON "Difference between 1.0 and the minimum %s greater than 1.0" 6742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define D_MIN "Minimum normalised %s" 6752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 6762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef PASS0 6772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 6782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Prototypes for what's to come: */ 6792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 6802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint false NOARGS; 6812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 6822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef BAD_STDDEF 6832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmchar *malloc (); /* Old style prototype, since we don't know what size_t is */ 6842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 6852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmchar *malloc ARGS((size_t size)); 6862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 6872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid free ARGS((char *p)); /* Syntax error here? Try -DNO_VOID */ 6882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 6892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid exit ARGS((int status)); 6902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 6912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmchar *f_rep ARGS((int precision, Long_double val)); 6922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 6932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint maximum_int NOARGS; 6942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint cprop NOARGS; 6952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint basic NOARGS; 6962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid sprop NOARGS; 6972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid iprop NOARGS; 6982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid lprop NOARGS; 6992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid usprop NOARGS; 7002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid uiprop NOARGS; 7012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid ulprop NOARGS; 7022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint fprop ARGS((int byte_size)); 7032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint dprop ARGS((int byte_size)); 7042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint ldprop ARGS((int byte_size)); 7052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid efprop ARGS((int fprec, int dprec, int lprec)); 7062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid edprop ARGS((int fprec, int dprec, int lprec)); 7072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid eldprop ARGS((int fprec, int dprec, int lprec)); 7082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 7092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint setmode ARGS((char *s)); 7102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid farewell ARGS((int bugs)); 7112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid describe ARGS((char *description, char *extra)); 7122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid missing ARGS((char *s)); 7132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid fmissing ARGS((char *s)); 7142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid check_defines NOARGS; 7152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid bitpattern ARGS((char *p, unsigned int size)); 7162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint ceil_log ARGS((int base, Long_double x)); 7172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid croak ARGS((int place)); 7182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid trap1 ARGS((int sig)); 7192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid eek_a_bug ARGS((char *problem)); 7202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid endian ARGS((int byte_size)); 7212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint exponent ARGS((Long_double x, Long_double *fract, int *exp)); 7222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint floor_log ARGS((int base, Long_double x)); 7232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid f_define ARGS((char *desc, char *extra, char *sort, char *name, 7242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int prec, Long_double val, char *mark)); 7252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid i_define ARGS((char *desc, char *extra, char *sort, char *name, 7262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm long val, long lim, long req, char *mark)); 7272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid u_define ARGS((char *desc, char *extra, char *sort, char *name, 7282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ulong val, ulong req, char *mark)); 7292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 7302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef NO_SIG /* There's no signal(), or setjmp/longjmp() */ 7312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 7322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Dummy routines instead */ 7332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm typedef int jmp_buf; 7342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 7352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int setjmp ARGS((jmp_buf lab)); 7362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 7372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm jmp_buf lab, mlab; 7382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int setjmp(jmp_buf lab) { return(0); } 7392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm void longjmp(jmp_buf lab, int val) { return; } 7402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 7412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Void signal(int i, void (*p)()) {} 7422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 7432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 7442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm jmp_buf lab, mlab; 7452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Void overflow(int sig) 7462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm { /* what to do on over/underflow */ 7472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm signal(sig, overflow); 7482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm longjmp(lab, 1); 7492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 7502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 7512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Void address(int sig) 7522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm { /* what to do on an address error */ 7532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm signal(sig, address); 7542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm longjmp(mlab, 1); 7552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 7562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 7572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /*NO_SIG*/ 7582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 7592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint V= 0, /* verbose */ 7602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm L= 0, /* produce limits.h */ 7612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm F= 0, /* produce float.h */ 7622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm bugs=0; /* The number of (possible) bugs in the output */ 7632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 7642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmchar co[4], oc[4]; /* Comment starter and ender symbols */ 7652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 7662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint bits_per_byte; /* the number of bits per unit returned by sizeof() */ 7672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint flt_rounds; /* The calculated value of FLT_ROUNDS */ 7682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint flt_radix; /* The calculated value of FLT_RADIX */ 7692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVolatile int trapped; /* For testing FPE traps */ 7702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 7712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef TEST 7722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Set the fp modes on a SUN with 68881 chip, to check that different 7732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm rounding modes etc. get properly detected. 7742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Compile with -f68881 for cc, -m68881 for gcc, and with additional flag 7752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm -DTEST. Run with additional parameter +hex-number, to set the 68881 mode 7762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm register to hex-number 7772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/ 7782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 7792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Bits 0x30 = rounding mode */ 7802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ROUND_BITS 0x30 7812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define TO_NEAREST 0x00 7822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define TO_ZERO 0x10 7832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define TO_MINUS_INF 0x20 7842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define TO_PLUS_INF 0x30 /* The SUN FP user's guide seems to be wrong here */ 7852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 7862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Bits 0xc0 = extended rounding */ 7872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define EXT_BITS 0xc0 7882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ROUND_EXTENDED 0x00 7892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ROUND_SINGLE 0x40 7902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ROUND_DOUBLE 0x80 7912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 7922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Enabled traps */ 7932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define EXE_INEX1 0x100 7942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define EXE_INEX2 0x200 7952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define EXE_DZ 0x400 7962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define EXE_UNFL 0x800 7972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define EXE_OVFL 0x1000 7982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define EXE_OPERR 0x2000 7992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define EXE_SNAN 0x4000 8002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define EXE_BSUN 0x8000 8012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 8022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Only used for testing, on a Sun with 68881 chip */ 8032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Print the FP mode */ 8042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmprintmode(new) unsigned new; { 8052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fpmode_(&new); 8062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("New fp mode:\n"); 8072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf(" Round toward "); 8082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm switch (new & ROUND_BITS) { 8092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case TO_NEAREST: printf("nearest"); break; 8102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case TO_ZERO: printf("zero"); break; 8112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case TO_MINUS_INF: printf("minus infinity"); break; 8122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case TO_PLUS_INF: printf("plus infinity"); break; 8132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm default: printf("???"); break; 8142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 8152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 8162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("\n Extended rounding precision: "); 8172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 8182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm switch (new & EXT_BITS) { 8192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case ROUND_EXTENDED: printf("extended"); break; 8202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case ROUND_SINGLE: printf("single"); break; 8212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case ROUND_DOUBLE: printf("double"); break; 8222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm default: printf("???"); break; 8232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 8242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 8252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("\n Enabled exceptions:"); 8262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (new & (unsigned) EXE_INEX1) printf(" inex1"); 8272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (new & (unsigned) EXE_INEX2) printf(" inex2"); 8282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (new & (unsigned) EXE_DZ) printf(" divz"); 8292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (new & (unsigned) EXE_UNFL) printf(" unfl"); 8302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (new & (unsigned) EXE_OVFL) printf(" ovfl"); 8312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (new & (unsigned) EXE_OPERR) printf(" operr"); 8322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (new & (unsigned) EXE_SNAN) printf(" snan"); 8332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (new & (unsigned) EXE_BSUN) printf(" bsun"); 8342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("\n"); 8352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 8362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 8372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Only used for testing, on a Sun with 68881 chip */ 8382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Set the FP mode */ 8392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint setmode(s) char *s; { 8402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm unsigned mode=0, dig; 8412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char c; 8422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 8432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while (*s) { 8442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm c= *s++; 8452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (c>='0' && c<='9') dig= c-'0'; 8462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm else if (c>='a' && c<='f') dig= c-'a'+10; 8472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm else if (c>='A' && c<='F') dig= c-'A'+10; 8482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm else return 1; 8492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm mode= mode<<4 | dig; 8502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 8512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printmode(mode); 8522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return 0; 8532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 8542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define SETMODE 8552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 8562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 8572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef TESTI /* Test mode using SunOs IEEE routines */ 8582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 8592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#include <sys/ieeefp.h> 8602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 8612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint setmode(char *s) { 8622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char *dummy, c, *cmd, *val; 8632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while (*s) { 8642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm switch (c= *s++) { 8652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case '=': cmd= "direction"; val= "nearest"; break; 8662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case '0': cmd= "direction"; val= "tozero"; break; 8672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case '+': cmd= "direction"; val= "positive"; break; 8682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case '-': cmd= "direction"; val= "negative"; break; 8692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case '1': cmd= "precision"; val= "single"; break; 8702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case '2': cmd= "precision"; val= "double"; break; 8712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case '3': cmd= "precision"; val= "extended"; break; 8722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case '~': cmd= "exception"; val= "inexact"; break; 8732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case '/': cmd= "exception"; val= "division"; break; 8742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case '>': cmd= "exception"; val= "overflow"; break; 8752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case '<': cmd= "exception"; val= "underflow"; break; 8762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm default: 8772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("Bad setmode character: %c\n", c); 8782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return 1; 8792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm break; 8802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 8812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("Set %s %s", cmd, val); 8822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (ieee_flags("set", cmd, val, &dummy)) { 8832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf(": failed\n"); 8842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return 1; 8852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 8862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("\n"); 8872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 8882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return 0; 8892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 8902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define SETMODE 8912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 8922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 8932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef SETMODE 8942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* ARGSUSED */ 8952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint 8962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmsetmode(char *s) 8972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 8982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fprintf(stderr, "Can't set mode: not compiled with TEST\n"); 8992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return(1); 9002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 9012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 9022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 9032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint 9042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmmemeq( 9052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char *p1, 9062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int size1, 9072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char *p2, 9082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int size2 9092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ) 9102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 9112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* See if two blocks of store are identical */ 9122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int i; 9132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (size1 != size2) return 0; 9142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm for (i=1; i<=size1; i++) { 9152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (*p1++ != *p2++) return 0; 9162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 9172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return 1; 9182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 9192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 9202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid 9212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmfarewell(int bugs) 9222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 9232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (bugs == 0) exit(0); 9242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("\n%sFor hints on dealing with the ", co); 9252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (bugs == 1) printf("problem"); 9262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm else printf("%d problems", bugs); 9272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf(" above\n see the section 'TROUBLESHOOTING' in the file "); 9282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%s%s\n", FILENAME, oc); 9292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm exit(bugs); 9302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 9312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 9322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* The program has received a signal where it wasn't expecting one */ 9332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid 9342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmcroak(int place) 9352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 9362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("*** Unexpected signal at point %d\n", place); 9372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm farewell(bugs+1); /* An exit isn't essential here, but avoids loops */ 9382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 9392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 9402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* This is here in case alloca.c is used, which calls this. */ 9412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmchar * 9422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmxmalloc(unsigned size) 9432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 9442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char *value = malloc(size); 9452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (value == 0) { 9462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fprintf(stderr, "Virtual memory exceeded\n"); 9472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm exit(bugs+1); 9482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 9492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return value; 9502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 9512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 9522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint maxint; 9532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 9542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint 9552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmmaximum_int( void ) 9562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 9572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Find the maximum integer */ 9582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Volatile int newi, int_max, two=2; 9592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 9602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Calculate maxint ***********************************/ 9612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Calculate 2**n-1 until overflow - then use the previous value */ 9622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 9632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm newi=1; int_max=0; 9642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 9652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab)==0) { /* Yields int_max */ 9662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while(newi>int_max) { 9672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int_max=newi; 9682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm newi=newi*two+1; 9692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 9702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 9712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(0); 9722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return int_max; 9732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 9742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 9752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* How long are my identifiers? I could go further here, but some compilers 9762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm have line length limits that I don't want to break. 9772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/ 9782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 9792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint zzzzzzzzz1zzzzzzzzz2zzzzzzzzz3zzzzzzzzz4zzzzzzzzz5zzzzzzzzz6zzzz=64; 9802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 9812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint 9822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmname_len( void ) 9832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 9842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int zzzzzzzzz1zzzzzzzzz2zzzzzzzzz3zz=32; 9852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm { int zzzzzzzzz1zzzzzz=16; 9862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm { int zzzzzzzz=8; 9872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm { int zzzzzzz=7; 9882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm { int zzzzzz=6; 9892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return 9902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm zzzzzzzzz1zzzzzzzzz2zzzzzzzzz3zzzzzzzzz4zzzzzzzzz5zzzzzzzzz6zzzz; 9912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 9922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 9932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 9942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 9952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 9962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 9972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define aaaaaaaaa1aaaaaaaaa2aaaaaaaaa3aaaaaaaaa4aaaaaaaaa5aaaaaaaaa6aaaa 64 9982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define LENGTH 64 9992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 10002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef aaaaaaaaa1aaaaaaaaa2aaaaaaaaa3aa 10012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef LENGTH 10022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define LENGTH 32 10032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 10042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 10052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef aaaaaaaaa1aaaaaa 10062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef LENGTH 10072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define LENGTH 16 10082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 10092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 10102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef aaaaaaaa 10112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef LENGTH 10122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define LENGTH 8 10132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 10142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 10152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef aaaaaaaaa1aaaaaaaaa2aaaaaaaaa3aaaaaaaaa4aaaaaaaaa5aaaaaaaaa6aaaa 10162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 10172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid long_names() 10182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 10192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int l= name_len(); 10202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("Compiler names are at least %d chars long", l); 10212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (l != 64) 10222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf(" (but less than %d)", l*2); 10232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("\n"); 10242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("Preprocessor names are at least %d long", LENGTH); 10252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (LENGTH != 64) 10262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf(" (but less than %d)", LENGTH*2); 10272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("\n\n"); 10282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 10292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 10302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Used by FPROP to see if FP traps are generated, and if they may return */ 10312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 10322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid 10332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmtrap2(int sig) 10342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 10352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm longjmp(lab, 1); 10362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 10372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 10382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid 10392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmtrap1(int sig) 10402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 10412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm trapped= 1; /* A global */ 10422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm signal(sig, trap2); 10432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 10442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 10452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid 10462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmsetsignals( void ) 10472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 10482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SIGFPE 10492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm signal(SIGFPE, overflow); 10502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 10512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SIGOVER 10522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm signal(SIGOVER, overflow); 10532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 10542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SIGBUS 10552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm signal(SIGBUS, address); 10562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 10572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SIGSEGV 10582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm signal(SIGSEGV, address); 10592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 10602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Add more calls as necessary */ 10612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 10622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 10632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef LENGTH 10642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 10652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint 10662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmmain(int argc, char *argv[]) 10672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 10682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int dprec, fprec, lprec; 10692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int i; 10702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm wchar_t *s; 10712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int bad; 10722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 10732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm setsignals(); 10742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(1); 10752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 10762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm bad=0; 10772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm for (i=1; i < argc; i++) { 10782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm s = (wchar_t *)(argv[i]); 10792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (*s == L'-') { 10802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm s++; 10812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while (*s) { 10822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm switch (*(s++)) { 10832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case L'v': V=1; break; 10842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case L'l': L=1; break; 10852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case L'f': F=1; break; 10862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm default: bad=1; break; 10872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 10882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 10892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else if (*s == L'+') { 10902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm s++; 10912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm bad = setmode((char *)s); 10922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else bad= 1; 10932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 10942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (bad) { 10952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fprintf(stderr, 10962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm "Usage: %ls [-vlf]\n v=Verbose l=Limits.h f=Float.h\n", 10972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (wchar_t *)(argv[0])); 10982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm exit(1); 10992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 11002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (L || F) { 11012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co[0]= '/'; oc[0]= ' '; 11022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co[1]= '*'; oc[1]= '*'; 11032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co[2]= ' '; oc[2]= '/'; 11042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co[3]= '\0'; oc[3]= '\0'; 11052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 11062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co[0]= '\0'; oc[0]= '\0'; 11072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm V=1; 11082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 11092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 11102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (L) printf("%slimits.h%s\n", co, oc); 11112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (F) printf("%sfloat.h%s\n", co, oc); 11122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef ID 11132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%sProduced by enquire version %s (%s), CWI, Amsterdam\n %s\n", 11142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, VERSION, ID, WEB, oc); 11152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 11162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%sProduced by enquire version %s, CWI, Amsterdam\n %s %s\n", 11172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, VERSION, WEB, oc); 11182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 11192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 11202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef VERIFY 11212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%sVerification phase%s\n", co, oc); 11222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 11232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 11242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef NO_SIG 11252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sCompiled without signal(): %s%s\n", 11262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, 11272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm "there's nothing that can be done if overflow occurs", 11282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm oc); 11292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 11302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef NO_SC 11312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sCompiled without signed char%s\n", co, oc); 11322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 11332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef NO_UC 11342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sCompiled without unsigned char%s\n", co, oc); 11352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 11362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef NO_UI 11372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sCompiled without unsigned short or long%s\n", co, oc); 11382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 11392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef __STDC__ 11402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sCompiler claims to be ANSI C level %d%s\n", 11412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, __STDC__, oc); 11422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 11432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sCompiler does not claim to be ANSI C%s\n", co, oc); 11442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 11452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("\n"); 11462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 11472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm long_names(); 11482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm check_defines(); 11492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 11502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm maxint= maximum_int(); 11512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm bits_per_byte= basic(); 11522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("\n"); 11532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (F||V) { 11542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fprec= fprop(bits_per_byte); 11552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm dprec= dprop(bits_per_byte); 11562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm lprec= ldprop(bits_per_byte); 11572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm efprop(fprec, dprec, lprec); 11582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm edprop(fprec, dprec, lprec); 11592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eldprop(fprec, dprec, lprec); 11602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 11612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef BAD_MALLOC 11622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (V) { 11632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* An extra goody: the approximate amount of data-space */ 11642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Allocate store until no more available */ 11652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Different implementations have a different argument type 11662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm to malloc. Here we assume that it's the same type as 11672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm that which sizeof() returns */ 11682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm unsigned int size; 11692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Volatile long total; 11702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char kmg, *ptr, *save; 11712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char **link; 11722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 11732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm save= NULL; 11742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm size=maximum_int()/4; 11752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm total=0; 11762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while (size!=0) { 11772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(mlab) == 0) { 11782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while ((ptr= malloc((false()?sizeof(int):size))) != (char *)NULL) { 11792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm //if (save == NULL) save= ptr; /* save the biggest chunk */ 11802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm link = (char **)ptr; 11812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (save == NULL) { 11822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm // Save pointer to first allocated chunk 11832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm save= ptr; 11842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm *link = NULL; 11852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 11862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm else { 11872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm // Build list of all subsequently allocated chunks, LIFO 11882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm *link = save; 11892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm save = ptr; 11902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 11912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm total+=(size/2); 11922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 11932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 11942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eek_a_bug("Trying to malloc all store generates a trap"); 11952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 11962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm size/=2; 11972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 11982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(mlab)!=0) croak(-1); 11992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 12002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm //if (save != NULL) free(save); 12012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while(save != NULL) { 12022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm link = (char **)save; 12032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ptr = *link; 12042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm free(save); 12052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm save = ptr; 12062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 12072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 12082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm total= (total+511)/512; /* Sic */ kmg= 'K'; 12092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (total > 10000) { 12102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm total= (total+999)/1000; kmg= 'M'; 12112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 12122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (total > 10000) { 12132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm total= (total+999)/1000; kmg= 'G'; 12142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 12152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (total > 10000) { 12162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm total= (total+999)/1000; kmg= 'T'; 12172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 12182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sMemory mallocatable ~= %ld %cbytes%s\n", 12192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, total, kmg, oc); 12202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 12212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 12222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm farewell(bugs); 12232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return bugs; /* To keep compilers and lint happy */ 12242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 12252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 12262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid 12272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmeek_a_bug(char *problem) 12282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 12292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* The program has discovered a problem */ 12302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("\n%s*** WARNING: %s%s\n", co, problem, oc); 12312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm bugs++; 12322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 12332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 12342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid 12352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmdescribe(char *description, char *extra) 12362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 12372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Produce the description for a #define */ 12382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf(" %s", co); 12392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf(description, extra); 12402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%s\n", oc); 12412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 12422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 12432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid 12442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmi_define( 12452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char *desc, 12462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char *extra, 12472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char *sort, 12482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char *name, 12492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm long val, 12502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm long lim, 12512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm long req, 12522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char *mark 12532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ) 12542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 12552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Produce a #define for a signed int type */ 12562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm describe(desc, extra); 12572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (val >= 0) { 12582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("#define %s%s %ld%s\n", sort, name, val, mark); 12592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else if (val + lim < 0) { 12602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* We may not produce a constant like -1024 if the max 12612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm allowable value is 1023. It has then to be output as 12622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm -1023-1. lim is the max allowable value. */ 12632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("#define %s%s (%ld%s%ld%s)\n", 12642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm sort, name, -lim, mark, val+lim, mark); 12652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 12662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("#define %s%s (%ld%s)\n", sort, name, val, mark); 12672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 12682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* If VERIFY is not set, val and req are just the same value; 12692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if it is set, val is the value as calculated, and req is 12702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm the #defined constant 12712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm */ 12722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (val != req) { 12732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%s*** Verify failed for above #define!\n", co); 12742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf(" Compiler has %ld for value%s\n\n", req, oc); 12752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm bugs++; 12762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 12772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("\n"); 12782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 12792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 12802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid 12812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmu_define( 12822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char *desc, 12832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char *extra, 12842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char *sort, 12852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char *name, 12862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ulong val, 12872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ulong req, 12882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char *mark 12892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ) 12902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 12912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Produce a #define for an unsigned value */ 12922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm describe(desc, extra); 12932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("#define %s%s %lu%s%s\n", sort, name, val, U, mark); 12942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (val != req) { 12952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%s*** Verify failed for above #define!\n", co); 12962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf(" Compiler has %lu for value%s\n\n", req, oc); 12972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm bugs++; 12982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 12992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("\n"); 13002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 13012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 13022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid f_define( 13032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char *desc, 13042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char *extra, 13052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char *sort, 13062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char *name, 13072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int precision, 13082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Long_double val, 13092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char *mark 13102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ) 13112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 13122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Produce a #define for a float/double/long double */ 13132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm describe(desc, extra); 13142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (stdc) { 13152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("#define %s%s %s%s\n", 13162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm sort, name, f_rep(precision, val), mark); 13172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else if (*mark == 'F') { 13182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* non-ANSI C has no float constants, so cast the constant */ 13192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("#define %s%s ((float)%s)\n", 13202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm sort, name, f_rep(precision, val)); 13212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 13222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("#define %s%s %s\n", sort, name, f_rep(precision, val)); 13232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 13242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("\n"); 13252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 13262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 13272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint 13282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmfloor_log(int base, Long_double x) 13292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 13302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* return floor(log base(x)) */ 13312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int r=0; 13322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while (x>=base) { r++; x/=base; } 13332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return r; 13342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 13352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 13362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint 13372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmceil_log(int base, Long_double x) 13382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 13392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int r=0; 13402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while (x>1.0) { r++; x/=base; } 13412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return r; 13422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 13432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 13442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint 13452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmexponent(Long_double x, Long_double *fract, int *exp) 13462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 13472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Split x into a fraction and a power of ten; 13482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm returns 0 if x is unusable, 1 otherwise. 13492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Only used for error messages about faulty output. 13502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm */ 13512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int r=0, neg=0; 13522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Long_double old; 13532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm *fract=0.0; *exp=0; 13542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (x<0.0) { 13552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm x= -x; 13562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm neg= 1; 13572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 13582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (x==0.0) return 1; 13592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (x>=10.0) { 13602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while (x>=10.0) { 13612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm old=x; r++; x/=10.0; 13622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (old==x) return 0; 13632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 13642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 13652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while (x<1.0) { 13662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm old=x; r--; x*=10.0; 13672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (old==x) return 0; 13682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 13692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 13702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (neg) *fract= -x; 13712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm else *fract= x; 13722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm *exp=r; 13732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return 1; 13742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 13752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 13762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmchar * 13772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmf_rep(int precision, Long_double val) 13782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 13792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Return the floating representation of val */ 13802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm static char buf[1024]; 13812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char *f1; 13822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (sizeof(double) == sizeof(Long_double)) { 13832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Assume they're the same, and use non-stdc format */ 13842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* This is for stdc compilers using non-stdc libraries */ 13852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f1= "%.*e"; 13862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 13872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* It had better support Le then */ 13882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f1= "%.*Le"; 13892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 13902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm sprintf(buf, f1, precision, val); 13912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return buf; 13922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 13932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 13942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid 13952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmbitpattern(char *p, unsigned int size) 13962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 13972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Printf the bit-pattern of p */ 13982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char c; 13992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm unsigned int i; 14002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int j; 14012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 14022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm for (i=1; i<=size; i++) { 14032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm c= *p; 14042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm p++; 14052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm for (j=bits_per_byte-1; j>=0; j--) 14062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%c", (c>>j)&1 ? '1' : '0'); 14072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (i!=size) printf(" "); 14082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 14092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 14102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 14112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid 14122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmfill(char *p, int size) 14132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 14142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char *ab= "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 14152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int i; 14162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 14172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm for (i=0; i<size; i++) 14182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm p[i]= ab[i]; 14192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 14202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 14212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Order(x, mode)\ 14222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%s%s ", co, mode); fill((char *)&x, sizeof(x)); \ 14232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm for (i=1; i<=sizeof(x); i++) { c=((x>>(byte_size*(sizeof(x)-i)))&mask);\ 14242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm putchar(c==0 ? '?' : (char)c); }\ 14252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%s\n", oc); 14262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 14272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid 14282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmendian(int byte_size) 14292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 14302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Printf the byte-order used on this machine */ 14312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /*unsigned*/ short s=0; 14322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /*unsigned*/ int j=0; 14332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /*unsigned*/ long l=0; 14342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 14352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm unsigned int mask, i, c; 14362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 14372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm mask=0; 14382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm for (i=1; i<=(unsigned)byte_size; i++) mask= (mask<<1)|1; 14392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 14402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (V) { 14412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%sCHARACTER ORDER%s\n", co, oc); 14422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Order(s, "short:"); 14432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Order(j, "int: "); 14442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Order(l, "long: "); 14452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 14462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 14472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 14482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid 14492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmmissing(char *s) 14502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 14512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%s*** #define %s missing from limits.h%s\n", co, s, oc); 14522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm bugs++; 14532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 14542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 14552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid 14562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmfmissing(char *s) 14572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 14582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%s*** #define %s missing from float.h%s\n", co, s, oc); 14592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm bugs++; 14602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 14612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 14622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* To try and fool optimisers */ 14632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint false( void ) { return 0; } 14642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 14652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Promoted(x) (false()?(x):(-1)) 14662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define is_signed(x) (Promoted(x) < 0) 14672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define sign_of(x) (is_signed(x)?"signed":"unsigned") 14682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Signed 1 14692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Unsigned 0 14702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define sgn(x) ((is_signed(x))?Signed:Unsigned) 14712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 14722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define showtype(t, x) Vprintf("%s%s %s %s%s\n", co, t, sign_of(x), type_of((int)sizeof(x)), oc) 14732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 14742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmchar *type_of(int x) 14752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 14762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (x == sizeof(char)) { 14772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (sizeof(char) == sizeof(int)) return "char/short/int"; 14782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (sizeof(char) == sizeof(short)) return "char/short"; 14792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return "char"; 14802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 14812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (x == sizeof(short)) { 14822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (sizeof(short) == sizeof(int)) return "short/int"; 14832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return "short"; 14842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 14852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (x == sizeof(int)) { 14862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (sizeof(int) == sizeof(long)) return "int/long"; 14872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return "int"; 14882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 14892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (x == sizeof(long)) return "long"; 14902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return "unknown-type"; 14912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 14922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 14932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmchar *ftype_of(int x) 14942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 14952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (x == sizeof(float)) { 14962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return "float"; 14972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 14982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (x == sizeof(double)) { 14992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (sizeof(double) == sizeof(Long_double)) 15002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return "(long)double"; 15012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return "double"; 15022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 15032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (x == sizeof(Long_double)) { 15042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return "long double"; 15052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 15062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return "unknown-type"; 15072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 15082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 15092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid typerr(char *name, int esign, int esize, int sign, int size) 15102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 15112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("*** %s has wrong type: expected %s %s, found %s %s\n", 15122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm name, sign_of(esign), type_of(esize), 15132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm sign_of(sign), type_of(size)); 15142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 15152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 15162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid ftyperr(char *name, int esize, int size) 15172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 15182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("*** %s has wrong type: expected %s, found %s\n", 15192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm name, ftype_of(esize), ftype_of(size)); 15202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 15212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 15222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid promotions( void ) 15232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 15242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int si; long sl; 15252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm unsigned int ui; 15262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm short ss; 15272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 15282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef NO_UI 15292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm unsigned long ul; /* if this fails, define NO_UI */ 15302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm unsigned short us; /* if this fails, define NO_UI */ 15312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 15322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ul=0; us=0; 15332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 15342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Shut compiler warnings up: */ 15352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm si=0; sl=0; ui=0; ss=0; 15362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 15372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("\n%sPROMOTIONS%s\n", co, oc); 15382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 15392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Sanity checks. Possible warnings here; should be no problem */ 15402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (is_signed(ui)) 15412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eek_a_bug("unsigned int promotes to signed!\n"); 15422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (!is_signed(si)) 15432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eek_a_bug("signed int promotes to unsigned!\n"); 15442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (!is_signed(sl)) 15452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eek_a_bug("signed long promotes to unsigned!\n"); 15462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (sizeof(Promoted(si)) != sizeof(int)) 15472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eek_a_bug("int doesn't promote to int!\n"); 15482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (sizeof(Promoted(sl)) != sizeof(long)) 15492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eek_a_bug("long doesn't promote to long!\n"); 15502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (sizeof(Promoted(ss)) != sizeof(int)) 15512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eek_a_bug("short doesn't promote to int!\n"); 15522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (sizeof(Promoted(ui)) != sizeof(int)) 15532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eek_a_bug("unsigned int doesn't promote to int!\n"); 15542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef NO_UI 15552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (sizeof(Promoted(ul)) != sizeof(long)) 15562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eek_a_bug("unsigned long doesn't promote to long!\n"); 15572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (is_signed(ul)) 15582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eek_a_bug("unsigned long promotes to signed!\n"); 15592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 15602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 15612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef NO_UI 15622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm showtype("unsigned short promotes to", Promoted(us)); 15632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 15642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm showtype("long+unsigned gives", sl+ui); 15652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 15662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 15672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define checktype(x, n, s, t) if((sgn(x)!=s)||(sizeof(x)!=sizeof(t))) typerr(n, s, (int)sizeof(t), sgn(x), (int)sizeof(x)); 15682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 15692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define fchecktype(x, n, t) if (sizeof(x) != sizeof(t)) ftyperr(n, (int)sizeof(x), (int)sizeof(t)); 15702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 15712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid check_defines( void ) 15722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 15732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* ensure that all #defines are present and have the correct type */ 15742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef VERIFY 15752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int usign; 15762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 15772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef NO_UI 15782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm usign= Signed; 15792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 15802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Implementations promote unsigned short differently */ 15812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm usign= is_signed((unsigned short)0); 15822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 15832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 15842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (L) { 15852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef CHAR_BIT 15862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(CHAR_BIT, "CHAR_BIT", Signed, int); 15872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 15882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm missing("CHAR_BIT"); 15892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 15902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef CHAR_MAX 15912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(CHAR_MAX, "CHAR_MAX", Signed, int); 15922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 15932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm missing("CHAR_MAX"); 15942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 15952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef CHAR_MIN 15962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(CHAR_MIN, "CHAR_MIN", Signed, int); 15972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 15982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm missing("CHAR_MIN"); 15992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 16002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SCHAR_MAX 16012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(SCHAR_MAX, "SCHAR_MAX", Signed, int); 16022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 16032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm missing("SCHAR_MAX"); 16042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 16052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SCHAR_MIN 16062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(SCHAR_MIN, "SCHAR_MIN", Signed, int); 16072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 16082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm missing("SCHAR_MIN"); 16092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 16102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef UCHAR_MAX 16112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(UCHAR_MAX, "UCHAR_MAX", Signed, int); 16122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 16132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm missing("UCHAR_MAX"); 16142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 16152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SHRT_MAX 16162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(SHRT_MAX, "SHRT_MAX", Signed, int); 16172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 16182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm missing("SHRT_MAX"); 16192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 16202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SHRT_MIN 16212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(SHRT_MIN, "SHRT_MIN", Signed, int); 16222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 16232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm missing("SHRT_MIN"); 16242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 16252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef INT_MAX 16262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(INT_MAX, "INT_MAX", Signed, int); 16272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 16282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm missing("INT_MAX"); 16292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 16302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef INT_MIN 16312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(INT_MIN, "INT_MIN", Signed, int); 16322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 16332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm missing("INT_MIN"); 16342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 16352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LONG_MAX 16362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(LONG_MAX, "LONG_MAX", Signed, long); 16372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 16382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm missing("LONG_MAX"); 16392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 16402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LONG_MIN 16412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(LONG_MIN, "LONG_MIN", Signed, long); 16422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 16432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm missing("LONG_MIN"); 16442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 16452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef USHRT_MAX 16462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(USHRT_MAX, "USHRT_MAX", usign, int); 16472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 16482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm missing("USHRT_MAX"); 16492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 16502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef UINT_MAX 16512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(UINT_MAX, "UINT_MAX", Unsigned, int); 16522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 16532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm missing("UINT_MAX"); 16542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 16552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef ULONG_MAX 16562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(ULONG_MAX, "ULONG_MAX", Unsigned, long); 16572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 16582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm missing("ULONG_MAX"); 16592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 16602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } /* if (L) */ 16612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 16622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (F) { 16632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_RADIX 16642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(FLT_RADIX, "FLT_RADIX", Signed, int); 16652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 16662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("FLT_RADIX"); 16672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 16682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MANT_DIG 16692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(FLT_MANT_DIG, "FLT_MANT_DIG", Signed, int); 16702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 16712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("FLT_MANT_DIG"); 16722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 16732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_DIG 16742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(FLT_DIG, "FLT_DIG", Signed, int); 16752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 16762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("FLT_DIG"); 16772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 16782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_ROUNDS 16792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(FLT_ROUNDS, "FLT_ROUNDS", Signed, int); 16802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 16812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("FLT_ROUNDS"); 16822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 16832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_EPSILON 16842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fchecktype(FLT_EPSILON, "FLT_EPSILON", float); 16852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 16862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("FLT_EPSILON"); 16872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 16882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MIN_EXP 16892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(FLT_MIN_EXP, "FLT_MIN_EXP", Signed, int); 16902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 16912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("FLT_MIN_EXP"); 16922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 16932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MIN 16942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fchecktype(FLT_MIN, "FLT_MIN", float); 16952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 16962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("FLT_MIN"); 16972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 16982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MIN_10_EXP 16992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(FLT_MIN_10_EXP, "FLT_MIN_10_EXP", Signed, int); 17002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 17012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("FLT_MIN_10_EXP"); 17022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 17032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MAX_EXP 17042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(FLT_MAX_EXP, "FLT_MAX_EXP", Signed, int); 17052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 17062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("FLT_MAX_EXP"); 17072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 17082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MAX 17092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fchecktype(FLT_MAX, "FLT_MAX", float); 17102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 17112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("FLT_MAX"); 17122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 17132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MAX_10_EXP 17142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(FLT_MAX_10_EXP, "FLT_MAX_10_EXP", Signed, int); 17152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 17162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("FLT_MAX_10_EXP"); 17172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 17182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MANT_DIG 17192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(DBL_MANT_DIG, "DBL_MANT_DIG", Signed, int); 17202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 17212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("DBL_MANT_DIG"); 17222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 17232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_DIG 17242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(DBL_DIG, "DBL_DIG", Signed, int); 17252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 17262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("DBL_DIG"); 17272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 17282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_EPSILON 17292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fchecktype(DBL_EPSILON, "DBL_EPSILON", double); 17302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 17312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("DBL_EPSILON"); 17322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 17332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MIN_EXP 17342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(DBL_MIN_EXP, "DBL_MIN_EXP", Signed, int); 17352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 17362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("DBL_MIN_EXP"); 17372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 17382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MIN 17392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fchecktype(DBL_MIN, "DBL_MIN", double); 17402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 17412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("DBL_MIN"); 17422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 17432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MIN_10_EXP 17442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(DBL_MIN_10_EXP, "DBL_MIN_10_EXP", Signed, int); 17452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 17462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("DBL_MIN_10_EXP"); 17472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 17482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MAX_EXP 17492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(DBL_MAX_EXP, "DBL_MAX_EXP", Signed, int); 17502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 17512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("DBL_MAX_EXP"); 17522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 17532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MAX 17542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fchecktype(DBL_MAX, "DBL_MAX", double); 17552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 17562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("DBL_MAX"); 17572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 17582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MAX_10_EXP 17592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(DBL_MAX_10_EXP, "DBL_MAX_10_EXP", Signed, int); 17602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 17612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("DBL_MAX_10_EXP"); 17622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 17632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef STDC 17642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MANT_DIG 17652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(LDBL_MANT_DIG, "LDBL_MANT_DIG", Signed, int); 17662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 17672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("LDBL_MANT_DIG"); 17682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 17692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_DIG 17702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(LDBL_DIG, "LDBL_DIG", Signed, int); 17712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 17722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("LDBL_DIG"); 17732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 17742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_EPSILON 17752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fchecktype(LDBL_EPSILON, "LDBL_EPSILON", long double); 17762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 17772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("LDBL_EPSILON"); 17782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 17792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MIN_EXP 17802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(LDBL_MIN_EXP, "LDBL_MIN_EXP", Signed, int); 17812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 17822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("LDBL_MIN_EXP"); 17832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 17842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MIN 17852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fchecktype(LDBL_MIN, "LDBL_MIN", long double); 17862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 17872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("LDBL_MIN"); 17882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 17892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MIN_10_EXP 17902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(LDBL_MIN_10_EXP, "LDBL_MIN_10_EXP", Signed, int); 17912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 17922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("LDBL_MIN_10_EXP"); 17932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 17942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MAX_EXP 17952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(LDBL_MAX_EXP, "LDBL_MAX_EXP", Signed, int); 17962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 17972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("LDBL_MAX_EXP"); 17982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 17992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MAX 18002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fchecktype(LDBL_MAX, "LDBL_MAX", long double); 18012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 18022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("LDBL_MAX"); 18032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 18042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MAX_10_EXP 18052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm checktype(LDBL_MAX_10_EXP, "LDBL_MAX_10_EXP", Signed, int); 18062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 18072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fmissing("LDBL_MAX_10_EXP"); 18082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 18092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* STDC */ 18102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } /* if (F) */ 18112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* VERIFY */ 18122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 18132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 18142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef VERIFY 18152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef SCHAR_MAX 18162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define SCHAR_MAX char_max 18172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 18182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef SCHAR_MIN 18192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define SCHAR_MIN char_min 18202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 18212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef UCHAR_MAX 18222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define UCHAR_MAX char_max 18232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 18242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* VERIFY */ 18252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 18262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef CHAR_BIT 18272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define CHAR_BIT char_bit 18282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 18292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef CHAR_MAX 18302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define CHAR_MAX char_max 18312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 18322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef CHAR_MIN 18332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define CHAR_MIN char_min 18342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 18352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef SCHAR_MAX 18362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define SCHAR_MAX char_max 18372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 18382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef SCHAR_MIN 18392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define SCHAR_MIN char_min 18402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 18412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef UCHAR_MAX 18422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define UCHAR_MAX char_max 18432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 18442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 18452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint cprop( void ) 18462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 18472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Properties of type char */ 18482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Volatile char c, char_max, char_min; 18492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Volatile int byte_size, c_signed; 18502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm long char_bit; 18512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 18522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(2); 18532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 18542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Calculate number of bits per character *************************/ 18552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm c=1; byte_size=0; 18562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm do { c=c<<1; byte_size++; } while(c!=0); 18572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm c= (char)(-1); 18582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (((int)c)<0) c_signed=1; 18592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm else c_signed=0; 18602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%schar = %d bits, %ssigned%s\n", 18612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, (int)sizeof(c)*byte_size, (c_signed?"":"un"), oc); 18622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char_bit=(long)(sizeof(c)*byte_size); 18632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (L) i_define(D_CHAR_BIT, "", "CHAR", "_BIT", 18642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char_bit, 0L, (long) CHAR_BIT, ""); 18652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 18662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm c=0; char_max=0; 18672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm c++; 18682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab)==0) { /* Yields char_max */ 18692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while (c>char_max) { 18702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char_max=c; 18712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm c=(char)(c*2+1); 18722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 18732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 18742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sCharacter overflow generates a trap!%s\n", co, oc); 18752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 18762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm c=0; char_min=0; 18772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm c--; 18782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (c<char_min) /* then the min char < 0 */ { 18792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Minimum value: assume either two's or one's complement *********/ 18802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char_min= -char_max; 18812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab)==0) { /* Yields char_min */ 18822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (char_min-1 < char_min) char_min--; 18832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 18842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 18852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(8); 18862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (c_signed && char_min == 0) { 18872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sBEWARE! Chars are pseudo-unsigned:%s\n", co, oc); 18882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%s %s%s%s\n", 18892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm "They contain only nonnegative values, ", 18902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm "but sign extend when used as integers.", co, oc); 18912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 18922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(3); 18932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 18942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (L) { 18952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Because of the integer promotions, you must use a U after 18962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm the MAX_CHARS in the following cases */ 18972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if ((sizeof(char) == sizeof(int)) && !c_signed) { 18982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm u_define(D_CHAR_MAX, "", "CHAR", "_MAX", 18992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (ulong) char_max, 19002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (ulong) CHAR_MAX, ""); 19012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 19022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm i_define(D_CHAR_MAX, "", "CHAR", "_MAX", 19032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) char_max, 0L, 19042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) CHAR_MAX, ""); 19052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 19062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm i_define(D_CHAR_MIN, "", "CHAR", "_MIN", 19072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) char_min, (long) maxint, 19082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) CHAR_MIN, ""); 19092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (c_signed) { 19102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm i_define(D_SCHAR_MAX, "", "SCHAR", "_MAX", 19112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) char_max, 0L, 19122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) SCHAR_MAX, ""); 19132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm i_define(D_SCHAR_MIN, "", "SCHAR", "_MIN", 19142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) char_min, (long) maxint, 19152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) SCHAR_MIN, ""); 19162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 19172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (sizeof(char) == sizeof(int)) { 19182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm u_define(D_UCHAR_MAX, "", "UCHAR", "_MAX", 19192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (ulong) char_max, 19202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (ulong) UCHAR_MAX, ""); 19212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 19222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm i_define(D_UCHAR_MAX, "", "UCHAR", "_MAX", 19232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) char_max, 0L, 19242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) UCHAR_MAX, ""); 19252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 19262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 19272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 19282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (c_signed) { 19292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef NO_UC 19302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Syntax error? Define NO_UC */ Volatile unsigned char c1, char_max; 19312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm c1=0; char_max=0; 19322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm c1++; 19332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab)==0) { /* Yields char_max */ 19342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while (c1>char_max) { 19352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char_max=c1; 19362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm c1++; 19372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 19382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 19392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(4); 19402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (sizeof(char) == sizeof(int)) { 19412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm u_define(D_UCHAR_MAX, "", "UCHAR", "_MAX", 19422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (ulong) char_max, 19432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (ulong) UCHAR_MAX, ""); 19442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 19452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm i_define(D_UCHAR_MAX, "", "UCHAR", "_MAX", 19462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) char_max, 0L, 19472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) UCHAR_MAX, ""); 19482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 19492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 19502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 19512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef NO_SC 19522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Syntax error? Define NO_SC */ Volatile signed char c1, char_max, char_min; 19532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm c1=0; char_max=0; 19542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm c1++; 19552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab)==0) { /* Yields char_max */ 19562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while (c1>char_max) { 19572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char_max=c1; 19582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm c1++; 19592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 19602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 19612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm c1=0; char_min=0; 19622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm c1--; 19632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab)==0) { /* Yields char_min */ 19642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while (c1<char_min) { 19652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char_min=c1; 19662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm c1--; 19672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 19682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 19692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(5); 19702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm i_define(D_SCHAR_MIN, "", "SCHAR", "_MIN", 19712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) char_min, (long) maxint, 19722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) SCHAR_MIN, ""); 19732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm i_define(D_SCHAR_MAX, "", "SCHAR", "_MAX", 19742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) char_max, 0L, 19752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) SCHAR_MAX, ""); 19762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* NO_SC */ 19772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 19782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 19792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return byte_size; 19802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 19812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 19822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint basic( void ) 19832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 19842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* The properties of the basic types. 19852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Returns number of bits per sizeof unit */ 19862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Volatile int byte_size; 19872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm typedef int function (); 19882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int variable; 19892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char *cp; int *ip; function *fp; 19902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int *p, *q; 19912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 19922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sSIZES%s\n", co, oc); 19932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm byte_size= cprop(); 19942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 19952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Shorts, ints and longs *****************************************/ 19962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sshort=%d int=%d long=%d float=%d double=%d bits %s\n", 19972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, 19982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (int) sizeof(short)*byte_size, 19992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (int) sizeof(int)*byte_size, 20002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (int) sizeof(long)*byte_size, 20012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (int) sizeof(float)*byte_size, 20022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (int) sizeof(double)*byte_size, oc); 20032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (stdc) { 20042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%slong double=%d bits%s\n", 20052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, (int) sizeof(Long_double)*byte_size, oc); 20062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 20072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%schar*=%d bits%s%s\n", 20082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, (int)sizeof(char *)*byte_size, 20092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm sizeof(char *)>sizeof(int)?" BEWARE! larger than int!":"", 20102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm oc); 20112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sint* =%d bits%s%s\n", 20122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, (int)sizeof(int *)*byte_size, 20132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm sizeof(int *)>sizeof(int)?" BEWARE! larger than int!":"", 20142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm oc); 20152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sfunc*=%d bits%s%s\n", 20162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, (int)sizeof(function *)*byte_size, 20172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm sizeof(function *)>sizeof(int)?" BEWARE! larger than int!":"", 20182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm oc); 20192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 20202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm showtype("Type size_t is", sizeof(0)); 20212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef STDC 20222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm showtype("Type wchar_t is", L'x'); 20232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 20242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 20252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Alignment constants ********************************************/ 20262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 20272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define alignment(TYPE) \ 20282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ((long)((char *)&((struct{char c; TYPE d;}*)0)->d - (char *)0)) 20292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 20302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("\n%sALIGNMENTS%s\n", co, oc); 20312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 20322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%schar=%ld short=%ld int=%ld long=%ld%s\n", 20332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, 20342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm alignment(char), alignment(short), 20352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm alignment(int), alignment(long), 20362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm oc); 20372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 20382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sfloat=%ld double=%ld%s\n", 20392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, 20402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm alignment(float), alignment(double), 20412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm oc); 20422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 20432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (stdc) { 20442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%slong double=%ld%s\n", 20452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, 20462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm alignment(Long_double), 20472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm oc); 20482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 20492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%schar*=%ld int*=%ld func*=%ld%s\n", 20502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, 20512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm alignment(char *), alignment(int *), alignment(function *), 20522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm oc); 20532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 20542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("\n"); 20552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 20562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Ten little endians *********************************************/ 20572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 20582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm endian(byte_size); 20592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 20602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Pointers *******************************************************/ 20612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 20622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("\n%sPROPERTIES OF POINTERS%s\n", co, oc); 20632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm cp= (char *) &variable; 20642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ip= (int *) &variable; 20652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fp= (function *) &variable; 20662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 20672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sChar and int pointer formats ", co); 20682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (memeq((char *) &cp, sizeof(cp), (char *) &ip, sizeof(ip))) { 20692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("seem identical%s\n", oc); 20702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 20712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("are different%s\n", oc); 20722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 20732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sChar and function pointer formats ", co); 20742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (memeq((char *) &cp, sizeof(cp), (char *) &fp, sizeof(fp))) { 20752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("seem identical%s\n", oc); 20762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 20772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("are different%s\n", oc); 20782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 20792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 20802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (V) { 20812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if ((VOID *)"abcd" == (VOID *)"abcd") 20822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%sStrings are shared%s\n", co, oc); 20832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm else printf("%sStrings are not shared%s\n", co, oc); 20842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 20852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 20862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm p=0; q=0; 20872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm showtype("Type ptrdiff_t is", p-q); 20882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 20892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm //if (setjmp(mlab) == 0) { 20902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm // variable= *p; 20912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm // Vprintf("%sBEWARE! Dereferencing NULL doesn't cause a trap%s\n", 20922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm // co, oc); 20932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm //} else { 20942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm // Vprintf("%sDereferencing NULL causes a trap%s\n", co, oc); 20952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm //} 20962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(mlab)!=0) croak(-2); 20972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 20982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("\n%sPROPERTIES OF INTEGRAL TYPES%s\n", co, oc); 20992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 21002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm sprop(); 21012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm iprop(); 21022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm lprop(); 21032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm usprop(); 21042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm uiprop(); 21052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ulprop(); 21062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 21072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm promotions(); 21082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 21092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(6); 21102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 21112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return byte_size; 21122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 21132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 21142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else /* not PASS0 */ 21152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 21162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SEP 21172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* The global variables used by several passes */ 21182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmextern jmp_buf lab; 21192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmextern int V, L, F, bugs, bits_per_byte; 21202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmextern int maxint, flt_radix, flt_rounds; 21212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmextern Volatile int trapped; 21222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmextern char co[], oc[]; 21232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmextern char *f_rep(); 21242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmextern Void trap1(); 21252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* SEP */ 21262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* ifdef PASS0 */ 21272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 21282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* As I said, I apologise for the contortions below. The functions are 21292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm expanded by the preprocessor twice or three times (for float and double, 21302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm and maybe for long double, and for short, int and long). That way, 21312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm I never make a change to one that I forget to make to the other. 21322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm You can look on it as C's fault for not supporting multi-line macros. 21332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm This whole file is read 3 times by the preprocessor, with PASSn set for 21342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm n=1, 2 or 3, to decide which parts to reprocess. 21352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/ 21362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 21372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* #undef on an already undefined thing is (wrongly) flagged as an error 21382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm by some compilers, therefore the #ifdef that follows: 21392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/ 21402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef Number 21412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Number 21422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef THING 21432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Thing 21442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef thing 21452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef FPROP 21462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Fname 21472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Store 21482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Sum 21492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Diff 21502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Mul 21512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Div 21522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef ZERO 21532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef HALF 21542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef ONE 21552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef TWO 21562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef THREE 21572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef FOUR 21582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Self 21592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef F_check 21602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Verify 21612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef EPROP 21622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef MARK 21632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 21642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* These are the float.h constants */ 21652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef F_RADIX 21662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef F_MANT_DIG 21672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef F_DIG 21682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef F_ROUNDS 21692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef F_EPSILON 21702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef F_MIN_EXP 21712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef F_MIN 21722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef F_MIN_10_EXP 21732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef F_MAX_EXP 21742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef F_MAX 21752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef F_MAX_10_EXP 21762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 21772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 21782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef Integer 21792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Integer 21802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef INT 21812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef IPROP 21822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Iname 21832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef UPROP 21842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef Uname 21852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef OK_UI 21862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef IMARK 21872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 21882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef I_MAX 21892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef I_MIN 21902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef U_MAX 21912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 21922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 21932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef PASS1 21942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 21952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Define the things we're going to use this pass */ 21962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 21972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Number float 21982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define THING "FLOAT" 21992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Thing "Float" 22002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define thing "float" 22012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Fname "FLT" 22022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define FPROP fprop 22032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Store fStore 22042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Sum fSum 22052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Diff fDiff 22062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Mul fMul 22072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Div fDiv 22082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ZERO 0.0 22092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define HALF 0.5 22102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ONE 1.0 22112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define TWO 2.0 22122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define THREE 3.0 22132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define FOUR 4.0 22142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Self fSelf 22152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_check fCheck 22162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define MARK "F" 22172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef VERIFY 22182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Verify fVerify 22192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 22202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 22212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define EPROP efprop 22222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 22232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Integer short 22242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define INT "short" 22252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define IPROP sprop 22262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Iname "SHRT" 22272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef NO_UI 22282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define OK_UI 1 22292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 22302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define IMARK "" 22312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 22322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define UPROP usprop 22332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Uname "USHRT" 22342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 22352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef VERIFY 22362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SHRT_MAX 22372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define I_MAX SHRT_MAX 22382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 22392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SHRT_MIN 22402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define I_MIN SHRT_MIN 22412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 22422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef USHRT_MAX 22432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define U_MAX USHRT_MAX 22442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 22452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 22462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_RADIX 22472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_RADIX FLT_RADIX 22482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 22492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MANT_DIG 22502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MANT_DIG FLT_MANT_DIG 22512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 22522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_DIG 22532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_DIG FLT_DIG 22542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 22552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_ROUNDS 22562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_ROUNDS FLT_ROUNDS 22572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 22582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_EPSILON 22592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_EPSILON FLT_EPSILON 22602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 22612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MIN_EXP 22622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MIN_EXP FLT_MIN_EXP 22632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 22642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MIN 22652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MIN FLT_MIN 22662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 22672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MIN_10_EXP 22682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MIN_10_EXP FLT_MIN_10_EXP 22692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 22702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MAX_EXP 22712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MAX_EXP FLT_MAX_EXP 22722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 22732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MAX 22742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MAX FLT_MAX 22752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 22762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FLT_MAX_10_EXP 22772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MAX_10_EXP FLT_MAX_10_EXP 22782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 22792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* VERIFY */ 22802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 22812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* PASS1 */ 22822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 22832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef PASS2 22842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 22852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Number double 22862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define THING "DOUBLE" 22872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Thing "Double" 22882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define thing "double" 22892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Fname "DBL" 22902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define FPROP dprop 22912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Store dStore 22922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Sum dSum 22932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Diff dDiff 22942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Mul dMul 22952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Div dDiv 22962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ZERO 0.0 22972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define HALF 0.5 22982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ONE 1.0 22992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define TWO 2.0 23002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define THREE 3.0 23012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define FOUR 4.0 23022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Self dSelf 23032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_check dCheck 23042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define MARK "" 23052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef VERIFY 23062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Verify dVerify 23072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 23082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 23092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define EPROP edprop 23102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 23112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Integer int 23122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define INT "int" 23132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define IPROP iprop 23142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Iname "INT" 23152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define OK_UI 1 /* Unsigned int is always possible */ 23162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define IMARK "" 23172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 23182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define UPROP uiprop 23192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Uname "UINT" 23202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 23212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef VERIFY 23222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef INT_MAX 23232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define I_MAX INT_MAX 23242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 23252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef INT_MIN 23262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define I_MIN INT_MIN 23272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 23282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef UINT_MAX 23292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define U_MAX UINT_MAX 23302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 23312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 23322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MANT_DIG 23332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MANT_DIG DBL_MANT_DIG 23342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 23352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_DIG 23362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_DIG DBL_DIG 23372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 23382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_EPSILON 23392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_EPSILON DBL_EPSILON 23402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 23412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MIN_EXP 23422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MIN_EXP DBL_MIN_EXP 23432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 23442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MIN 23452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MIN DBL_MIN 23462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 23472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MIN_10_EXP 23482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MIN_10_EXP DBL_MIN_10_EXP 23492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 23502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MAX_EXP 23512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MAX_EXP DBL_MAX_EXP 23522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 23532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MAX 23542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MAX DBL_MAX 23552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 23562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef DBL_MAX_10_EXP 23572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MAX_10_EXP DBL_MAX_10_EXP 23582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 23592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* VERIFY */ 23602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 23612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* PASS2 */ 23622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 23632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef PASS3 23642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 23652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef STDC 23662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Number long double 23672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 23682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ZERO 0.0L 23692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define HALF 0.5L 23702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ONE 1.0L 23712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define TWO 2.0L 23722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define THREE 3.0L 23732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define FOUR 4.0L 23742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 23752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 23762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define THING "LONG DOUBLE" 23772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Thing "Long double" 23782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define thing "long double" 23792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Fname "LDBL" 23802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define FPROP ldprop 23812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Store ldStore 23822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Sum ldSum 23832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Diff ldDiff 23842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Mul ldMul 23852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Div ldDiv 23862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Self ldSelf 23872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_check ldCheck 23882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define MARK "L" 23892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef VERIFY 23902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Verify ldVerify 23912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 23922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 23932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define EPROP eldprop 23942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 23952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Integer long 23962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define INT "long" 23972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define IPROP lprop 23982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Iname "LONG" 23992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef NO_UI 24002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define OK_UI 1 24012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define IMARK "L" 24032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 24042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define UPROP ulprop 24052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Uname "ULONG" 24062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 24072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef VERIFY 24082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LONG_MAX 24092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define I_MAX LONG_MAX 24102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LONG_MIN 24122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define I_MIN LONG_MIN 24132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef ULONG_MAX 24152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define U_MAX ULONG_MAX 24162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 24182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MANT_DIG 24192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MANT_DIG LDBL_MANT_DIG 24202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_DIG 24222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_DIG LDBL_DIG 24232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_EPSILON 24252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_EPSILON LDBL_EPSILON 24262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MIN_EXP 24282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MIN_EXP LDBL_MIN_EXP 24292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MIN 24312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MIN LDBL_MIN 24322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MIN_10_EXP 24342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MIN_10_EXP LDBL_MIN_10_EXP 24352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MAX_EXP 24372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MAX_EXP LDBL_MAX_EXP 24382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MAX 24402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MAX LDBL_MAX 24412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef LDBL_MAX_10_EXP 24432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MAX_10_EXP LDBL_MAX_10_EXP 24442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* VERIFY */ 24462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 24472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* PASS3 */ 24482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 24492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* The rest of the file gets read all three times; 24502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm the differences are encoded in the things #defined above. 24512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/ 24522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 24532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef I_MAX 24542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define I_MAX int_max 24552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef I_MIN 24572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define I_MIN int_min 24582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef U_MAX 24602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define U_MAX u_max 24612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 24632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef F_RADIX 24642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_RADIX f_radix 24652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef F_MANT_DIG 24672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MANT_DIG f_mant_dig 24682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef F_DIG 24702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_DIG f_dig 24712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef F_ROUNDS 24732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_ROUNDS f_rounds 24742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef F_EPSILON 24762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_EPSILON f_epsilon 24772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef F_MIN_EXP 24792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MIN_EXP f_min_exp 24802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef F_MIN 24822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MIN f_min 24832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef F_MIN_10_EXP 24852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MIN_10_EXP f_min_10_exp 24862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef F_MAX_EXP 24882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MAX_EXP f_max_exp 24892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef F_MAX 24912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MAX f_max 24922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef F_MAX_10_EXP 24942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define F_MAX_10_EXP f_max_10_exp 24952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 24962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 24972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef VERIFY 24982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define Verify(prec, val, req, same, same1) {;} 24992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 25002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 25012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef Integer 25022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 25032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid IPROP( void ) 25042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 25052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* the properties of short, int, and long */ 25062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Volatile Integer newi, int_max, maxeri, int_min, minneri; 25072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Volatile int ibits, ipower, two=2; 25082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 25092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Calculate max short/int/long ***********************************/ 25102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Calculate 2**n-1 until overflow - then use the previous value */ 25112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 25122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm newi=1; int_max=0; 25132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 25142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab)==0) { /* Yields int_max */ 25152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm for(ipower=0; newi>int_max; ipower++) { 25162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int_max=newi; 25172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm newi=newi*two+1; 25182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 25192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sOverflow of a%s %s does not generate a trap%s\n", 25202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, INT[0]=='i'?"n":"", INT, oc); 25212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 25222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sOverflow of a%s %s generates a trap%s\n", 25232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, INT[0]=='i'?"n":"", INT, oc); 25242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 25252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(7); 25262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 25272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Minimum value: assume either two's or one's complement *********/ 25282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int_min= -int_max; 25292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab)==0) { /* Yields int_min */ 25302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (int_min-1 < int_min) int_min--; 25312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 25322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(8); 25332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 25342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Now for those daft Cybers */ 25352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 25362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm maxeri=0; newi=int_max; 25372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 25382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab)==0) { /* Yields maxeri */ 25392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm for(ibits=ipower; newi>maxeri; ibits++) { 25402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm maxeri=newi; 25412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm newi=newi+newi+1; 25422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 25432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 25442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(9); 25452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 25462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm minneri= -maxeri; 25472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab)==0) { /* Yields minneri */ 25482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (minneri-1 < minneri) minneri--; 25492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 25502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(10); 25512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 25522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sMaximum %s = %ld (= 2**%d-1)%s\n", 25532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, INT, (long)int_max, ipower, oc); 25542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sMinimum %s = %ld%s\n", co, INT, (long)int_min, oc); 25552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 25562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (L) i_define(D_INT_MAX, INT, Iname, "_MAX", 25572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) int_max, 0L, 25582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) I_MAX, IMARK); 25592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (L) i_define(D_INT_MIN, INT, Iname, "_MIN", 25602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) int_min, (long) (PASS==1?maxint:int_max), 25612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) I_MIN, IMARK); 25622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 25632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if(int_max < 0) { /* It has happened (on a Cray) */ 25642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eek_a_bug("signed integral comparison faulty?"); 25652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 25662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 25672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (maxeri>int_max) { 25682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sThere is a larger %s, %ld (= 2**%d-1), %s %s%s\n", 25692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, INT, (long)maxeri, ibits, 25702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm "but only for addition, not multiplication", 25712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm "(I smell a Cyber!)", 25722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm oc); 25732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 25742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 25752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (minneri<int_min) { 25762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sThere is a smaller %s, %ld, %s %s%s\n", 25772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, INT, (long)minneri, 25782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm "but only for addition, not multiplication", 25792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm "(I smell a Cyber!)", 25802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm oc); 25812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 25822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 25832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 25842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid UPROP ( void ) 25852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 25862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* The properties of unsigned short/int/long */ 25872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef OK_UI 25882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Volatile unsigned Integer u_max, newi, two; 25892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm newi=1; u_max=0; two=2; 25902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 25912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab)==0) { /* Yields u_max */ 25922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while(newi>u_max) { 25932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm u_max=newi; 25942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm newi=newi*two+1; 25952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 25962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 25972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(11); 25982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sMaximum unsigned %s = %lu%s\n", 25992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, INT, (unsigned long) u_max, oc); 26002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 26012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Oh woe: new standard C defines value preserving promotions: 26022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 3.2.1.1: "If an int can represent all values of the original type, 26032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm the value is converted to an int; 26042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm otherwise it is converted to an unsigned int." 26052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm */ 26062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (L) { 26072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (PASS == 1 /* we're dealing with short */ 26082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm && u_max <= maxint /* an int can represent all values */ 26092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ) 26102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm { /* the value is converted to an int */ 26112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm i_define(D_UINT_MAX, INT, Uname, "_MAX", 26122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) u_max, 0L, 26132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) U_MAX, IMARK); 26142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { /* it is converted to an unsigned int */ 26152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm u_define(D_UINT_MAX, INT, Uname, "_MAX", 26162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (unsigned long) u_max, 26172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (unsigned long) U_MAX, IMARK); 26182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 26192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 26202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 26212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 26222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 26232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* Integer */ 26242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 26252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef Number 26262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 26272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* The following routines are intended to defeat any attempt at optimisation 26282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm or use of extended precision, and to defeat faulty narrowing casts. 26292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm The weird prototypes are because of widening incompatibilities. 26302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm*/ 26312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#if defined(STDC) || defined(_MSC_VER) 26322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ARGS1(A, a) (A a) 26332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ARGS2(A, a, B, b) (A a, B b) 26342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ARGS5(A, a, B, b, C, c, D, d, E, e) (A a, B b, C c, D d, E e) 26352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 26362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ARGS1(A, a) (a) A a; 26372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ARGS2(A, a, B, b) (a, b) A a; B b; 26382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define ARGS5(A, a, B, b, C, c, D, d, E, e) (a,b,c,d,e)A a; B b; C c; D d; E e; 26392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 26402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 26412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid Store ARGS2(Number, a, Number *, b) { *b=a; } 26422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmNumber Sum ARGS2(Number, a, Number, b) {Number r; Store(a+b, &r); return r; } 26432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmNumber Diff ARGS2(Number, a, Number, b){Number r; Store(a-b, &r); return r; } 26442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmNumber Mul ARGS2(Number, a, Number, b) {Number r; Store(a*b, &r); return r; } 26452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmNumber Div ARGS2(Number, a, Number, b) {Number r; Store(a/b, &r); return r; } 26462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmNumber Self ARGS1(Number, a) {Number r; Store(a, &r); return r; } 26472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 26482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid F_check ARGS((int precision, Long_double val1)); 26492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 26502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid F_check(int precision, Long_double val1) 26512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 26522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* You don't think I'm going to go to all the trouble of writing 26532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm a program that works out what all sorts of values are, only to 26542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm have printf go and print the wrong values out, do you? 26552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm No, you're right, so this function tries to see if printf 26562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm has written the right value, by reading it back again. 26572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm This introduces a new problem of course: suppose printf writes 26582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm the correct value, and scanf reads it back wrong... oh well. 26592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm But I'm adamant about this: the precision given is enough 26602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm to uniquely identify the printed number, therefore I insist 26612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm that sscanf read the number back identically. Harsh yes, but 26622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm sometimes you've got to be cruel to be kind. 26632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm */ 26642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Long_double new1, rem; 26652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Number val, new, diff; 26662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm int e; 26672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm char *rep, *f2; 26682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 26692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (sizeof(double) == sizeof(Long_double)) { 26702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Assume they're the same, and use non-stdc format */ 26712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* This is for stdc compilers using non-stdc libraries */ 26722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f2= "%le"; /* Input */ 26732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 26742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* It had better support Le then */ 26752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f2= "%Le"; 26762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 26772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm val= (Number) val1; 26782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm rep= f_rep(precision, (Long_double) val); 26792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab)==0) { 26802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm sscanf(rep, f2, &new1); 26812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 26822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eek_a_bug("sscanf caused a trap"); 26832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%s scanning: %s format: %s%s\n\n", co, rep, f2, oc); 26842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(12); 26852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return; 26862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 26872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 26882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab)==0) { /* See if new is usable */ 26892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm new= new1; 26902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (new != 0.0) { 26912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm diff= val/new - 1.0; 26922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (diff < 0.1) diff= 1.0; 26932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* That should be enough to generate a trap */ 26942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 26952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 26962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eek_a_bug("sscanf returned an unusable number"); 26972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%s scanning: %s with format: %s%s\n\n", 26982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, rep, f2, oc); 26992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(13); 27002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return; 27012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 27022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 27032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(14); 27042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (new != val) { 27052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eek_a_bug("Possibly bad output from printf above"); 27062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (!exponent((Long_double)val, &rem, &e)) { 27072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%s but value was an unusable number%s\n\n", 27082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, oc); 27092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return; 27102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 27112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%s expected value around ", co); 27122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm //if (sizeof(double) == sizeof(Long_double)) { 27132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Assume they're the same, and use non-stdc format */ 27142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* This is for stdc compilers using non-stdc libraries */ 27152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm //printf("%.*fe%d, bit pattern:\n ", precision, rem, e); 27162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm //} else { 27172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* It had better support Lfe then */ 27182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%.*Lfe%d, bit pattern:\n ", precision, rem, e); 27192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm //} 27202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm bitpattern((char *) &val, (unsigned)sizeof(val)); 27212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf ("%s\n", oc); 27222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%s sscanf gave %s, bit pattern:\n ", 27232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, f_rep(precision, (Long_double) new)); 27242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm bitpattern((char *) &new, (unsigned)sizeof(new)); 27252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf ("%s\n", oc); 27262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab) == 0) { 27272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm diff= val-new; 27282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%s difference= %s%s\n\n", 27292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, f_rep(precision, (Long_double) diff), oc); 27302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } /* else forget it */ 27312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(15); 27322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 27332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 27342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 27352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef VERIFY 27362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid Verify ARGS5(int, prec, Number, val, Number, req, int, same, int, same1) 27372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 27382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Check that the compiler has read a #define value correctly */ 27392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(16); 27402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (!same) { 27412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%s*** Verify failed for above #define!\n", co); 27422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab) == 0) { /* for the case that req == nan */ 27432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf(" Compiler has %s for value\n", 27442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f_rep(prec, req)); 27452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 27462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf(" Compiler has %s for value\n", 27472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm "an unusable number"); 27482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 27492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab) == 0) { 27502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm F_check(prec, (Long_double) req); 27512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } /*else forget it*/ 27522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab) == 0) { 27532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (req > 0.0 && val > 0.0) { 27542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf(" difference= %s\n", 27552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f_rep(prec, val-req)); 27562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 27572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } /*else forget it*/ 27582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(17); 27592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%s\n", oc); 27602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm bugs++; 27612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else if (!same1) { 27622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (stdc) eek_a_bug("constant has the wrong precision"); 27632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm else eek_a_bug("the cast didn't work"); 27642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("\n"); 27652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 27662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 27672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* VERIFY */ 27682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 27692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint FPROP(int byte_size) 27702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 27712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Properties of floating types, using algorithms by Cody and Waite 27722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm from MA Malcolm, as modified by WM Gentleman and SB Marovich. 27732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Further extended by S Pemberton. 27742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 27752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Returns the number of digits in the fraction. 27762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm */ 27772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 27782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Volatile int 27792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm i, f_radix, iexp, irnd, mrnd, f_rounds, f_mant_dig, 27802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm iz, k, inf, machep, f_max_exp, f_min_exp, mx, negeps, 27812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm mantbits, digs, f_dig, trap, 27822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm hidden, normal, f_min_10_exp, f_max_10_exp; 27832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Volatile Number 27842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm a, b, base, basein, basem1, f_epsilon, epsneg, 27852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eps, epsp1, etop, ebot, 27862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f_max, newxmax, f_min, xminner, y, y1, z, z1, z2; 27872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 27882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(18); 27892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 27902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sPROPERTIES OF %s%s\n", co, THING, oc); 27912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 27922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Base and size of significand **************************************/ 27932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* First repeatedly double until adding 1 has no effect. */ 27942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* For instance, if base is 10, with 3 significant digits */ 27952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* it will try 1, 2, 4, 8, ... 512, 1024, and stop there, */ 27962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* since 1024 is only representable as 1020. */ 27972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm a=1.0; 27982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab)==0) { /* inexact trap? */ 27992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm do { a=Sum(a, a); } 28002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while (Diff(Diff(Sum(a, ONE), a), ONE) == ZERO); 28012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 28022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm fprintf(stderr, "*** Program got loss-of-precision trap!\n"); 28032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* And supporting those is just TOO much trouble! */ 28042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm farewell(bugs+1); 28052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 28062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(19); 28072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Now double until you find a number that can be added to the */ 28082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* above number. For 1020 this is 8 or 16, depending whether the */ 28092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* result is rounded or truncated. */ 28102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* In either case the result is 1030. 1030-1020= the base, 10. */ 28112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm b=1.0; 28122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm do { b=Sum(b, b); } while ((base=Diff(Sum(a, b), a)) == ZERO); 28132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f_radix=base; 28142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sBase = %d%s\n", co, f_radix, oc); 28152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 28162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Sanity check; if base<2, I can't guarantee the rest will work */ 28172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (f_radix < 2) { 28182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eek_a_bug("Function return or parameter passing faulty? (This is a guess.)"); 28192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("\n"); 28202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return(0); 28212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 28222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 28232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (PASS == 1) { /* only for FLT */ 28242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm flt_radix= f_radix; 28252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (F) i_define(D_FLT_RADIX, "", "FLT", "_RADIX", 28262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) f_radix, 0L, (long) F_RADIX, ""); 28272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else if (f_radix != flt_radix) { 28282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("\n%s*** WARNING: %s %s (%d) %s%s\n", 28292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, thing, "arithmetic has a different radix", 28302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f_radix, "from float", oc); 28312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm bugs++; 28322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 28332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 28342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Now the number of digits precision */ 28352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f_mant_dig=0; b=1.0; 28362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm do { f_mant_dig++; b=Mul(b, base); } 28372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while (Diff(Diff(Sum(b, ONE), b), ONE) == ZERO); 28382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f_dig=floor_log(10, (Long_double)(b/base)) + (base==10?1:0); 28392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sSignificant base digits = %d %s %d %s%s\n", 28402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, f_mant_dig, "(= at least", f_dig, "decimal digits)", oc); 28412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (F) i_define(D_MANT_DIG, thing, Fname, "_MANT_DIG", 28422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) f_mant_dig, 0L, (long) F_MANT_DIG, ""); 28432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (F) i_define(D_DIG, thing, Fname, "_DIG", 28442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) f_dig, 0L, (long) F_DIG, ""); 28452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm digs= ceil_log(10, (Long_double)b); /* the number of digits to printf */ 28462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 28472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Rounding *******************************************************/ 28482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm basem1=Diff(base, HALF); 28492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (Diff(Sum(a, basem1), a) != ZERO) { 28502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (f_radix == 2) basem1=0.375; 28512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm else basem1=1.0; 28522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (Diff(Sum(a, basem1), a) != ZERO) irnd=2; /* away from 0 */ 28532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm else irnd=1; /* to nearest */ 28542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else irnd=0; /* towards 0 */ 28552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 28562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm basem1=Diff(base, HALF); 28572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 28582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (Diff(Diff(-a, basem1), -a) != ZERO) { 28592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (f_radix == 2) basem1=0.375; 28602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm else basem1=1.0; 28612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (Diff(Diff(-a, basem1), -a) != ZERO) mrnd=2; /* away from 0*/ 28622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm else mrnd=1; /* to nearest */ 28632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else mrnd=0; /* towards 0 */ 28642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 28652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f_rounds= -1; /* Unknown rounding */ 28662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (irnd==0 && mrnd==0) f_rounds=0; /* zero = chops */ 28672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (irnd==1 && mrnd==1) f_rounds=1; /* nearest */ 28682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (irnd==2 && mrnd==0) f_rounds=2; /* +inf */ 28692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (irnd==0 && mrnd==2) f_rounds=3; /* -inf */ 28702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 28712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (f_rounds != -1) { 28722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sArithmetic rounds towards ", co); 28732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm switch (f_rounds) { 28742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case 0: Vprintf("zero (i.e. it chops)"); break; 28752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case 1: Vprintf("nearest"); break; 28762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case 2: Vprintf("+infinity"); break; 28772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm case 3: Vprintf("-infinity"); break; 28782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm default: Vprintf("???"); break; 28792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 28802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%s\n", oc); 28812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { /* Hmm, try to give some help here */ 28822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sArithmetic rounds oddly: %s\n", co, oc); 28832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%s Negative numbers %s%s\n", 28842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, mrnd==0 ? "towards zero" : 28852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm mrnd==1 ? "to nearest" : 28862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm "away from zero", 28872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm oc); 28882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%s Positive numbers %s%s\n", 28892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, irnd==0 ? "towards zero" : 28902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm irnd==1 ? "to nearest" : 28912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm "away from zero", 28922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm oc); 28932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 28942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* An extra goody */ 28952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (f_radix == 2 && f_rounds == 1) { 28962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (Diff(Sum(a, ONE), a) != ZERO) { 28972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%s Tie breaking rounds up%s\n", co, oc); 28982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else if (Diff(Sum(a, THREE), a) == FOUR) { 28992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%s Tie breaking rounds to even%s\n", co, oc); 29002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 29012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%s Tie breaking rounds down%s\n", co, oc); 29022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 29032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 29042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (PASS == 1) { /* only for FLT */ 29052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm flt_rounds= f_rounds; 29062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (F) 29072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm i_define(D_FLT_ROUNDS, "", "FLT", "_ROUNDS", 29082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) f_rounds, 1L, (long) F_ROUNDS, ""); 29092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else if (f_rounds != flt_rounds) { 29102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("\n%s*** WARNING: %s %s (%d) %s%s\n\n", 29112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, thing, "arithmetic rounds differently", 29122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f_rounds, "from float", oc); 29132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm bugs++; 29142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 29152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 29162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Various flavours of epsilon ************************************/ 29172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm negeps=f_mant_dig+f_mant_dig; 29182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm basein=1.0/base; 29192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm a=1.0; 29202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm for(i=1; i<=negeps; i++) a*=basein; 29212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 29222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm b=a; 29232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while (Diff(Diff(ONE, a), ONE) == ZERO) { 29242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm a*=base; 29252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm negeps--; 29262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 29272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm negeps= -negeps; 29282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sSmallest x such that 1.0-base**x != 1.0 = %d%s\n", 29292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, negeps, oc); 29302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 29312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm etop = ONE; 29322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ebot = ZERO; 29332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eps = Sum(ebot, Div(Diff(etop, ebot), TWO)); 29342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* find the smallest epsneg (1-epsneg != 1) by binary search. 29352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ebot and etop are the current bounds */ 29362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while (eps != ebot && eps != etop) { 29372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm epsp1 = Diff(ONE, eps); 29382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (epsp1 < ONE) etop = eps; 29392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm else ebot = eps; 29402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eps = Sum(ebot, Div(Diff(etop, ebot), TWO)); 29412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 29422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eps= etop; 29432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Sanity check */ 29442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (Diff(ONE, etop) >= ONE || Diff(ONE, ebot) != ONE) { 29452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eek_a_bug("internal error calculating epsneg"); 29462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 29472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sSmallest x such that 1.0-x != 1.0 = %s%s\n", 29482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, f_rep(digs, (Long_double) eps), oc); 29492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (V) F_check(digs, (Long_double) eps); 29502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 29512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm epsneg=a; 29522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if ((f_radix!=2) && irnd) { 29532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* a=(a*(1.0+a))/(1.0+1.0); => */ 29542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm a=Div(Mul(a, Sum(ONE, a)), Sum(ONE, ONE)); 29552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* if ((1.0-a)-1.0 != 0.0) epsneg=a; => */ 29562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (Diff(Diff(ONE, a), ONE) != ZERO) epsneg=a; 29572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 29582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* epsneg is used later */ 29592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(20); 29602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 29612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm machep= -f_mant_dig-f_mant_dig; 29622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm a=b; 29632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while (Diff(Sum(ONE, a), ONE) == ZERO) { a*=base; machep++; } 29642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sSmallest x such that 1.0+base**x != 1.0 = %d%s\n", 29652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, machep, oc); 29662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 29672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm etop = ONE; 29682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ebot = ZERO; 29692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eps = Sum(ebot, Div(Diff(etop, ebot), TWO)); 29702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* find the smallest eps (1+eps != 1) by binary search. 29712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm ebot and etop are the current bounds */ 29722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while (eps != ebot && eps != etop) { 29732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm epsp1 = Sum(ONE, eps); 29742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (epsp1 > ONE) etop = eps; 29752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm else ebot = eps; 29762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eps = Sum(ebot, Div(Diff(etop, ebot), TWO)); 29772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 29782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Sanity check */ 29792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (Sum(ONE, etop) <= ONE || Sum(ONE, ebot) != ONE) { 29802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eek_a_bug("internal error calculating eps"); 29812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 29822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f_epsilon=etop; 29832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 29842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sSmallest x such that 1.0+x != 1.0 = %s%s\n", 29852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, f_rep(digs, (Long_double) f_epsilon), oc); 29862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 29872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f_epsilon= Diff(Sum(ONE, f_epsilon), ONE); /* New C standard defn */ 29882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%s(Above number + 1.0) - 1.0 = %s%s\n", 29892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, f_rep(digs, (Long_double) (f_epsilon)), oc); 29902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 29912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Possible loss of precision warnings here from non-stdc compilers */ 29922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (F) f_define(D_EPSILON, thing, 29932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Fname, "_EPSILON", digs, (Long_double) f_epsilon, MARK); 29942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (V || F) F_check(digs, (Long_double) f_epsilon); 29952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(21); 29962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (F) Verify(digs, f_epsilon, F_EPSILON, 29972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f_epsilon == Self(F_EPSILON), 29982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (Long_double) f_epsilon == (Long_double) F_EPSILON); 29992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(22); 30002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 30012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Extra chop info *************************************************/ 30022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (f_rounds == 0) { 30032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (Diff(Mul(Sum(ONE,f_epsilon),ONE),ONE) != ZERO) { 30042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sAlthough arithmetic chops, it uses guard digits%s\n", co, oc); 30052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 30062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 30072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 30082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Size of and minimum normalised exponent ************************/ 30092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm y=0; i=0; k=1; z=basein; z1=(1.0+f_epsilon)/base; 30102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 30112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Coarse search for the largest power of two */ 30122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab)==0) { /* for underflow trap */ /* Yields i, k, y, y1 */ 30132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm do { 30142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm y=z; y1=z1; 30152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm z=Mul(y,y); z1=Mul(z1, y); 30162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm a=Mul(z,ONE); 30172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm z2=Div(z1,y); 30182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (z2 != y1) break; 30192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if ((Sum(a,a) == ZERO) || (fabs(z) >= y)) break; 30202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm i++; 30212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm k+=k; 30222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } while(1); 30232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 30242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%s%s underflow generates a trap%s\n", co, Thing, oc); 30252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 30262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(23); 30272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 30282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (f_radix != 10) { 30292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm iexp=i+1; /* for the sign */ 30302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm mx=k+k; 30312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 30322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm iexp=2; 30332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm iz=f_radix; 30342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while (k >= iz) { iz*=f_radix; iexp++; } 30352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm mx=iz+iz-1; 30362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 30372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 30382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Fine tune starting with y and y1 */ 30392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab)==0) { /* for underflow trap */ /* Yields k, f_min */ 30402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm do { 30412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f_min=y; z1=y1; 30422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm y=Div(y,base); y1=Div(y1,base); 30432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm a=Mul(y,ONE); 30442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm z2=Mul(y1,base); 30452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (z2 != z1) break; 30462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if ((Sum(a,a) == ZERO) || (fabs(y) >= f_min)) break; 30472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm k++; 30482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } while (1); 30492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 30502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(24); 30512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 30522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f_min_exp=(-k)+1; 30532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 30542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if ((mx <= k+k-3) && (f_radix != 10)) { mx+=mx; iexp+=1; } 30552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sNumber of bits used for exponent = %d%s\n", co, iexp, oc); 30562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sMinimum normalised exponent = %d%s\n", co, f_min_exp-1, oc); 30572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (F) 30582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm i_define(D_MIN_EXP, thing, Fname, "_MIN_EXP", 30592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) f_min_exp, (long) maxint, (long) F_MIN_EXP, ""); 30602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 30612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab)==0) { 30622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sMinimum normalised positive number = %s%s\n", 30632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, f_rep(digs, (Long_double) f_min), oc); 30642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 30652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eek_a_bug("printf can't print the smallest normalised number"); 30662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("\n"); 30672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 30682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(25); 30692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Possible loss of precision warnings here from non-stdc compilers */ 30702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab) == 0) { 30712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (F) f_define(D_MIN, thing, 30722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Fname, "_MIN", digs, (Long_double) f_min, MARK); 30732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (V || F) F_check(digs, (Long_double) f_min); 30742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 30752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eek_a_bug("xxx_MIN caused a trap"); 30762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("\n"); 30772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 30782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 30792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab) == 0) { 30802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (F) Verify(digs, f_min, F_MIN, 30812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f_min == Self(F_MIN), 30822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (Long_double) f_min == (Long_double) F_MIN); 30832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 30842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%s*** Verify failed for above #define!\n %s %s\n\n", 30852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, "Compiler has an unusable number for value", oc); 30862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm bugs++; 30872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 30882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(26); 30892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 30902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm a=1.0; f_min_10_exp=0; 30912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while (a > f_min*10.0) { a/=10.0; f_min_10_exp--; } 30922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (F) i_define(D_MIN_10_EXP, thing, Fname, "_MIN_10_EXP", 30932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) f_min_10_exp, (long) maxint, 30942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) F_MIN_10_EXP, ""); 30952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 30962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Minimum exponent ************************************************/ 30972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab)==0) { /* for underflow trap */ /* Yields xminner */ 30982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm do { 30992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm xminner=y; 31002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm y=Div(y,base); 31012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm a=Mul(y,ONE); 31022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if ((Sum(a,a) == ZERO) || (fabs(y) >= xminner)) break; 31032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } while (1); 31042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 31052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(27); 31062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 31072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (xminner != 0.0 && xminner != f_min) { 31082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm normal= 0; 31092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sThe smallest numbers are not kept normalised%s\n", 31102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, oc); 31112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab)==0) { 31122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sSmallest unnormalised positive number = %s%s\n", 31132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, f_rep(digs, (Long_double) xminner), oc); 31142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (V) F_check(digs, (Long_double) xminner); 31152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 31162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eek_a_bug("printf can't print the smallest unnormalised number."); 31172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("\n"); 31182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 31192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(28); 31202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 31212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm normal= 1; 31222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sThe smallest numbers are normalised%s\n", co, oc); 31232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 31242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 31252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Maximum exponent ************************************************/ 31262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f_max_exp=2; f_max=1.0; newxmax=base+1.0; 31272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm inf=0; trap=0; 31282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while (f_max<newxmax) { 31292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f_max=newxmax; 31302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab) == 0) { /* Yields inf, f_max_exp */ 31312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm newxmax=Mul(newxmax, base); 31322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 31332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm trap=1; 31342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm break; 31352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 31362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (Div(newxmax, base) != f_max) { 31372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (newxmax > f_max) inf=1; /* ieee infinity */ 31382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm break; 31392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 31402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f_max_exp++; 31412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 31422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(29); 31432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sMaximum exponent = %d%s\n", co, f_max_exp, oc); 31442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (F) i_define(D_MAX_EXP, thing, Fname, "_MAX_EXP", 31452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) f_max_exp, 0L, (long) F_MAX_EXP, ""); 31462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 31472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Largest number ***************************************************/ 31482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f_max=Diff(ONE, epsneg); 31492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (Mul(f_max,ONE) != f_max) f_max=Diff(ONE, Mul(base,epsneg)); 31502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm for (i=1; i<=f_max_exp; i++) f_max=Mul(f_max, base); 31512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 31522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab)==0) { 31532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sMaximum number = %s%s\n", 31542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, f_rep(digs, (Long_double) f_max), oc); 31552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 31562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eek_a_bug("printf can't print the largest double."); 31572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("\n"); 31582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 31592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab)==0) { 31602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Possible loss of precision warnings here from non-stdc compilers */ 31612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (F) f_define(D_MAX, thing, 31622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Fname, "_MAX", digs, (Long_double) f_max, MARK); 31632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (V || F) F_check(digs, (Long_double) f_max); 31642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 31652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eek_a_bug("xxx_MAX caused a trap"); 31662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("\n"); 31672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 31682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab)==0) { 31692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (F) Verify(digs, f_max, F_MAX, 31702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f_max == Self(F_MAX), 31712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (Long_double) f_max == (Long_double) F_MAX); 31722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 31732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("%s*** Verify failed for above #define!\n %s %s\n\n", 31742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, "Compiler has an unusable number for value", oc); 31752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm bugs++; 31762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 31772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(30); 31782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 31792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm a=1.0; f_max_10_exp=0; 31802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while (a < f_max/10.0) { a*=10.0; f_max_10_exp++; } 31812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (F) i_define(D_MAX_10_EXP, thing, Fname, "_MAX_10_EXP", 31822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (long) f_max_10_exp, 0L, (long) F_MAX_10_EXP, ""); 31832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 31842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Traps and infinities ********************************************/ 31852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (trap) { 31862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sOverflow generates a trap%s\n", co, oc); 31872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 31882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sOverflow doesn't seem to generate a trap%s\n", 31892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, oc); 31902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 31912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 31922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (inf) { Vprintf("%sThere is an 'infinite' value%s\n", co, oc); } 31932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 31942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef SIGFPE 31952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm signal(SIGFPE, trap1); 31962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 31972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab) == 0) { 31982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm trapped= 0; /* A global variable */ 31992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm b= 0.0; 32002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm a= (1.0/b)/b; 32012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (!trapped) { 32022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sDivide by zero doesn't generate a trap%s\n", 32032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, oc); 32042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 32052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sDivide by zero generates a trap%s\n", 32062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, oc); 32072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sFP signal handlers return safely%s\n", 32082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, oc); 32092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 32102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 32112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sDivide by zero generates a trap%s\n", co, oc); 32122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sBEWARE! FP signal handlers can NOT return%s\n", 32132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, oc); 32142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 32152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm setsignals(); 32162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(31); 32172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 32182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Hidden bit + sanity check ****************************************/ 32192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (f_radix != 10) { 32202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm hidden=0; 32212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm mantbits=floor_log(2, (Long_double)f_radix)*f_mant_dig; 32222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (mantbits+iexp == (int)sizeof(Number)*byte_size) { 32232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm hidden=1; 32242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sArithmetic uses a hidden bit%s\n", co, oc); 32252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else if (mantbits+iexp+1 == (int)sizeof(Number)*byte_size) { 32262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sArithmetic doesn't use a hidden bit%s\n", 32272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, oc); 32282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else if (mantbits+iexp+1 < (int)sizeof(Number)*byte_size) { 32292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sOnly %d of the %d bits of a %s %s%s\n", 32302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, 32312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm mantbits+iexp, 32322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (int)sizeof(Number)*byte_size, 32332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm thing, 32342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm "are actually used", 32352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm oc); 32362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 32372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("\n%s%s\n %s (%d) %s (%d) %s %s (%d)!%s\n\n", 32382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, 32392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm "*** Something fishy here!", 32402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm "Exponent size", 32412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm iexp, 32422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm "+ significand size", 32432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm mantbits, 32442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm "doesn't match with the size of a", 32452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm thing, 32462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm (int)sizeof(Number)*byte_size, 32472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm oc); 32482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 32492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (hidden && f_radix == 2 && f_max_exp+f_min_exp==3) { 32502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sIt looks like %s length IEEE format%s\n", 32512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, f_mant_dig==24 ? "single" : 32522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f_mant_dig==53 ? "double" : 32532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm f_mant_dig >53 ? "extended" : 32542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm "some", oc); 32552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (f_rounds != 1 || normal) { 32562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%s though ", co); 32572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (f_rounds != 1) { 32582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("the rounding is unusual"); 32592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (normal) { Vprintf(" and "); } 32602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 32612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (normal) { 32622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("the normalisation is unusual"); 32632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 32642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%s\n", oc); 32652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 32662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 32672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sIt doesn't look like IEEE format%s\n", 32682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, oc); 32692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 32702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 32712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm printf("\n"); /* regardless of verbosity */ 32722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm return f_mant_dig; 32732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 32742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 32752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid EPROP(int fprec, int dprec, int lprec) 32762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm{ 32772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* See if expressions are evaluated in extended precision. 32782aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Some compilers optimise even if you don't want it, 32792aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm and then this function fails to produce the right result. 32802aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm We try to diagnose this if it happens. 32812aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm */ 32822aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Volatile int eprec; 32832aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Volatile double a, b, base, old; 32842aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Volatile Number d, oldd, dbase, one, zero; 32852aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Volatile int bad=0; 32862aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 32872aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm /* Size of significand **************************************/ 32882aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm a=1.0; 32892aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab) == 0) { /* Yields nothing */ 32902aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm do { old=a; a=a+a; } 32912aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while ((((a+1.0)-a)-1.0) == 0.0 && a>old); 32922aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else bad=1; 32932aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (!bad && a <= old) bad=1; 32942aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 32952aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (!bad) { 32962aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm b=1.0; 32972aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab) == 0) { /* Yields nothing */ 32982aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm do { old=b; b=b+b; } 32992aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while ((base=((a+b)-a)) == 0.0 && b>old); 33002aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (b <= old) bad=1; 33012aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else bad=1; 33022aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 33032aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 33042aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (!bad) { 33052aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eprec=0; d=1.0; dbase=base; one=1.0; zero=0.0; 33062aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (setjmp(lab) == 0) { /* Yields nothing */ 33072aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm do { eprec++; oldd=d; d=d*dbase; } 33082aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm while ((((d+one)-d)-one) == zero && d>oldd); 33092aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (d <= oldd) bad=1; 33102aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else bad=1; 33112aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 33122aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 33132aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Unexpected(32); 33142aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 33152aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm if (bad) { 33162aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%sCan't determine precision for %s expressions:\n%s%s\n", 33172aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, thing, " check that you compiled without optimisation!", 33182aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm oc); 33192aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else if (eprec==dprec) { 33202aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%s%s expressions are evaluated in double precision%s\n", 33212aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, Thing, oc); 33222aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else if (eprec==fprec) { 33232aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%s%s expressions are evaluated in float precision%s\n", 33242aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, Thing, oc); 33252aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else if (eprec==lprec) { 33262aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%s%s expressions are evaluated in long double precision%s\n", 33272aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, Thing, oc); 33282aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } else { 33292aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm Vprintf("%s%s expressions are evaluated in a %s %s %d %s%s\n", 33302aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm co, Thing, eprec>dprec ? "higher" : "lower", 33312aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm "precision than double,\n using", 33322aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm eprec, "base digits", 33332aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm oc); 33342aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm } 33352aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm} 33362aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 33372aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else /* not Number */ 33382aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 33392aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef FPROP /* Then create dummy routines for long double */ 33402aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* ARGSUSED */ 33412aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmint FPROP(int byte_size) { return 0; } 33422aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 33432aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef EPROP 33442aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* ARGSUSED */ 33452aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylmVoid EPROP(int fprec, int dprec, int lprec) {} 33462aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 33472aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 33482aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* ifdef Number */ 33492aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 33502aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm/* Increment the pass number */ 33512aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef PASS 33522aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 33532aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef PASS2 33542aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef PASS2 33552aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define PASS 3 33562aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define PASS3 1 33572aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 33582aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 33592aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef PASS1 33602aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef PASS1 33612aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define PASS 2 33622aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#define PASS2 1 33632aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 33642aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 33652aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef PASS0 33662aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#undef PASS0 33672aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 33682aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm 33692aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifndef SEP 33702aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef PASS /* then rescan this file */ 33712aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#ifdef BAD_CPP 33722aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#include "enquire.c" 33732aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#else 33742aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#include FILENAME /* if this line fails to compile, define BAD_CPP */ 33752aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif 33762aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* PASS */ 33772aa62f2bc9a9654687b377d9ca8a8c2c860a3852darylm#endif /* SEP */ 3378