Path: utzoo!utgpu!water!watmath!clyde!cbosgd!mandrill!neoucom!wtm From: wtm@neoucom.UUCP (Bill Mayhew) Newsgroups: comp.sys.att Subject: Re: V30 PC6300 upgrades (NOT AGAIN!) Summary: V30 results: Keywords: v30, pc6300 Message-ID: <1010@neoucom.UUCP> Date: 15 Feb 88 22:24:41 GMT References: <4138@sdcc3.ucsd.EDU> Organization: Northeastern Ohio Universities College of Medicine Lines: 302 Here are some results that I got. I didn't feel like disassembling my AT&T to put the V-30 back in, so I only quote the V-30 results. Benchmarked with pi.c arctan series method (see below): To calculate 1st 5000 digits of pi. IBM PS/2 mod 80 SCO Xenix 2.2 cc -O: 0:15:38 IBM PS/2 mod 80 DOS 3.3 TC 1.5 large model: 0:16:02 Epson Equity III 8 MHz DOS 3.2 TC1.5 large model: 0:29:32 VAX 11/750 BSD 4.2 cc -O: 0:59:22 AT&T 6300 V-30, 8087 MSDOS 3.2 TC 1.5 large model: 1:09:02 AT&T 6300 V-30 no 8087: same AT&T Unix PC, 2 meg, cc -O Unix release 3.51: 1:53:18 The MSDOS results were obtained using the MKS Tooklits /bin/time program from ksh: /bin/time "./pi -5000 >/dev/nul" The same form was used for Unix/Xenix. In Xenix, I used csh to run the command, since ksh was not available. Note that it appears that SCO Xenix does not use the 80387, eventhogh one is installed. I determined that a 16 bit int divide requires 0.4 uS. A double real divide requires about 85 uS (!!). They probably don't use the 80387 since it maps into an interrupt that would interfere wit disk DMA if a floating point exception occurs-- definitely not a good thing for a multitasking environment. IBM engineering strikes again. I hope to give the pi calculation a try on a AT&T Tower '386 (still a prototype) in the next few days. /* ** NAME ** pi -- a program to calculate the value of pi ** ** SYNOPSIS ** pi {-}digits {t} ** ** DESCRIPTION ** Pi calculates the value of pi to the number of digits ** specified. Output is to the standard output, if the ** digits specifed is negative, output is formatted ** for attractive display on an 80col printer. ** ** The optional last argument "t" enables timing of the ** computational loop. The pitime() function must be supplied ** by the individual site implimentation. ** ** This is an adaptation in C of the BASIC program "Apple Pi" ** by Robert J. Bishop, published in Micro Apple (c) 1981 ** Micro Ink, Inc. That program, when run on an Apple II, ** took 40 hours to solve pi to 1000 places. Arrays of digits ** are used to impliment extended precision arithmatic. The ** program solves pi using the series expansion: ** ** infinity infinity ** ____ 16*(-1e(k+1)) ____ 4*(-1e(k+1)) ** \ \ ** pi = > ------------- - > ------------ ** / / ** ---- (2k-1)*5e(2k-1) ---- (2k-1)*239e(2k-1) ** k = 1 k = 1 ** ** AUTHOR ** Bryan Costales ( ...!dual!ptsfa!ski!eeg!bcx ) ** pi.c (c) 1985 Bryan Costales ** ** BUGS ** */ #include /* * The maximum number of digits (plus 5 for rounding). */ #define MAX 100005 /* * Global variables */ int Sign, Zero, Size, Pass, /* two passes */ Exp, /* exponent for divide */ Divide; /* * These character arrays represent the digits for extended * precision arithmatic. (These may need to be int on some machines). */ #define DIGIT char DIGIT Power[MAX], Term[MAX], Result[MAX]; main(argc, argv) int argc; char *argv[]; { static int constant[3]={0,25,239}; register int i; int charcount, printer = 0; void exit(); /* for lint */ if(argc == 1) { (void)fprintf(stderr,"usage: pi {-}digits {t}\n"); exit(1); } Size = atoi(argv[1]); if(Size < 0) { Size = -Size; printer++; } if(Size >= MAX-4 || Size <= 0) { (void)fprintf(stderr,"'digits' must be 1 thru %d.\n",MAX-5); exit(1); } if( (argc==3) && (*argv[2]=='t') ) { (void)fprintf(stderr,"start computation: "); pitime(); } for(Pass=1; Pass < 3; Pass++) { init(); do { copy(); Divide = Exp; div(Term); if ( Sign > 0 ) add(); if ( Sign < 0 ) sub(); Exp = Exp + 2; Sign *= -1; Divide = constant[Pass]; div(Power); if (Pass == 2) div(Power); } while( Zero != 0 ); } if( (argc == 3) && (*argv[2] == 't') ) { (void)fprintf(stderr,"end computation: "); pitime(); } if( printer ) { (void)printf("\t\tThe value of pi" ); (void)printf(" to %d decimal places\n\n\t\t",Size); } (void)printf("%d.",Result[0]); charcount = 0; for(i = 1; i <= Size; i++) { (void)printf( "%d", Result[i]); charcount++; if ( (charcount == 50) && printer ) { (void)printf( "\n\t\t " ); charcount = 0; } } (void)printf( "\n" ); return( 0 ); /* for lint */ } add() { register DIGIT *r, *t; register int sum, carry = 0; r = Result + Size; t = Term + Size; while( r >= Result ) { sum = *r + *t + carry; carry = 0; if( sum >= 10 ) { sum -= 10; carry++; } *r-- = sum; --t; } } sub() { register DIGIT *r, *t; register int diff, loan = 0; r = Result + Size; t = Term + Size; while( r >= Result ) { diff = *r - *t - loan; loan =0; if( diff < 0 ) { diff += 10; loan++; } *r-- = diff; --t; } } div(array) register DIGIT *array; { register DIGIT *end; register int quotient, residue, digit = 0; Zero = 0; for( end = array + Size; array <= end; ) { digit += *array; quotient = digit / Divide; residue = digit % Divide; if((Zero !=0) || ((quotient+residue) != 0)) Zero = 1; else Zero = 0; *array++ = quotient; digit = 10 * residue; } } init() { register DIGIT *p, *t, *r, *end; p = Power; t = Term; r = Result; end = Power+Size; while( p <= end ) { *p++ = 0; *t++ = 0; if (Pass == 1) *r++ = 0; } *Power = 16 / (Pass * Pass); if( Pass == 1 ) { Divide = 5; } else { Divide = 239; } div(Power); Exp = 1; Sign = 3 - (2 * Pass); } copy() { register DIGIT *t, *p, *end; t = Term; p = Power; end = Term + Size; while (t <= end) { *t++ = *p++; } } pitime() { /* Print the current time \n */ /* Here we just beep */ (void)fprintf( stderr, "%c\n", 0x07 ); }