void main()
{ char s[80]; double fabs(), floor(); #if EXPSCALE || EXPSC2 double exp(); #endif double sqrt(); /* required to compute rms error */ int i, j, k; long m, n;
merror = 0;
ldprec(); /* set up coprocessor. */ /*aiconf = -1;*/ /* configure Airy function */
x = 1.0;
z = x * x;
qmax = 0.0L;
sprintf(strmax, "%.4Le", qmax );
qrmsa = 0.0L;
qave = 0.0L;
#if1
printf(" Start at random number #:" );
gets( s );
sscanf( s, "%ld", &n );
printf("%ld\n", n ); #else
n = 0; #endif
for( m=0; m<n; m++ )
drand( &x );
n = 0;
m = 0;
x = floor( x );
loop:
for( i=0; i<500; i++ )
{
n++;
m++;
#if ONEARG || TWOARG || THREEARG || FOURARG /*ldprec();*/ /* set up floating point coprocessor */ /* make random number in desired range */
drand( &x );
x = WIDTH * ( x - 1.0 ) + LOW; #if EXPSCALE
x = exp(x);
drand( &a );
a = 1.0e-13 * x * a; if( x > 0.0 )
x -= a; else
x += a; #endif #if ONEINT
k = x;
x = k; #endif
v = x;
q1 = v; /* double number to q type */ #endif
/* do again if second argument required */
#if TWOARG || THREEARG || FOURARG
drand( &a );
a = WIDTHA * ( a - 1.0 ) + LOWA; /*a /= 50.0;*/ #if EXPSC2
a = exp(a);
drand( &y2 );
y2 = 1.0e-13 * y2 * a; if( a > 0.0 )
a -= y2; else
a += y2; #endif #if TWOINT || THREEINT
k = a + 0.25;
a = k; #endif
v = a;
qy4 = v; #endif
#if THREEARG || FOURARG
drand( &b ); #if PROB /* b=b-1.0; b=a*b;
*/ #if1 /* This makes b <= a, for bdtr. */
b = (a - LOWA) * ( b - 1.0 ) + LOWA; if( b > 1.0 && a > 1.0 )
b -= 1.0; else
{
a += 1.0;
k = a;
a = k;
v = a;
qy4 = v;
} #else
b = WIDTHA * ( b - 1.0 ) + LOWA; #endif
/* Half-integer a and b */ /* a=0.5*floor(2.0*a+1.0); b=0.5*floor(2.0*b+1.0);
*/
v = a;
qy4 = v; /*x = (a / (a+b));*/
#else
b = WIDTHA * ( b - 1.0 ) + LOWA; #endif #if THREEINT
j = b + 0.25;
b = j; #endif
v = b;
qb = v; #endif
#if FOURARG
drand( &c );
c = WIDTHA * ( c - 1.0 ) + LOWA; /* for hyp2f1 to ensure c-a-b > -1 */ /* z=c-a-b; if(z<-1.0) c-=1.6*z;
*/
v = c;
qc = v; #endif
#if VECARG for( j=0; j<3; j++)
{
drand( &x );
x = WIDTH * ( x - 1.0 ) + LOW;
v = x;
dp[j] = v;
q1 = v; /* double number to q type */
lp[j] = q1;
drand( &x );
x = WIDTH * ( x - 1.0 ) + LOW;
v = x;
dq[j] = v;
q1 = v; /* double number to q type */
lq[j] = q1;
} #endif/* VECARG */
/*printf("%.16E %.16E\n", a, x);*/ /* compute function under test */ /* Set to double precision */ /*dprec();*/ #if ONEARG #if FOURANS /*FUNC( x, &z, &y2, &y3, &y4 );*/
FUNC( x, &y4, &y2, &y3, &z ); #else #if TWOANS
FUNC( x, &z, &y2 ); /*FUNC( x, &y2, &z );*/ #else #if ONEINT
z = FUNC( k ); #else
z = FUNC( x ); #endif #endif #endif #endif
#if TWOARG #if TWOINT
z = FUNC( k, x ); /*z = FUNC( x, k );*/ /*z = FUNC( a, x );*/ #else #if FOURANS
FUNC( a, x, &z, &y2, &y3, &y4 ); #else
z = FUNC( a, x ); #endif #endif #endif
#if THREEARG #if THREEINT
z = FUNC( j, k, x ); #else
z = FUNC( a, b, x ); #endif #endif
#if FOURARG
z = FUNC( a, b, c, x ); #endif
#if VECARG
z = FUNC( dp, dq ); #endif
q2 = z; /* handle detected overflow */ if( (z == MAXNUM) || (z == -MAXNUM) )
{
printf("detected overflow "); #if FOURARG
printf("%.4E %.4E %.4E %.4E %.4E %6ld \n",
a, b, c, x, y, n); #else
printf("%.16E %.4E %.4E %6ld \n", x, a, z, n); #endif
e = 0.0;
m -= 1; goto endlup;
} /* Skip high precision if underflow. */ if( merror == UNDERFLOW ) goto underf;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.