[1910] in Athena Bugs
Saber gripe: v2.1. Beta2 (3/3/89 W20-575-35 vax Unix 2975 0)
daemon@ATHENA.MIT.EDU (Jonathan I. Kamens)
Wed Mar 15 19:17:35 1989
Date: Wed, 15 Mar 89 19:16:31 EST
From: Jonathan I. Kamens <jik@ATHENA.MIT.EDU>
To: raeburn@ATHENA.MIT.EDU
Cc: bugs@ATHENA.MIT.EDU
In-Reply-To: Ken Raeburn's message of Wed, 15 Mar 89 17:17:46 EST <8903152217.AA04348@PROMETHEUS.MIT.EDU>
Date: Wed, 15 Mar 89 17:17:46 EST
From: Ken Raeburn <raeburn@ATHENA.MIT.EDU>
From: <jik@ATHENA.MIT.EDU>
Date: Wed, 15 Mar 89 00:17:28 EST
I dismissed a run window in xsaver and got the following error
in my main saber window:
Saber internal (parsing) error (signal 12, Bad system call).
(internal location 0x5b1be, 0x7fffe870)
Trying to recover...
Do you have a file or sequence of commands you can give me which
demonstrates this problem?
-- Ken
Yes. The file below caused the problem. I didn't write the code, it
was sent to me as part of an OLC question, so I know absolutely
nothing about it.
*************************
main()
{
double maximize(), rroot(), groot(), integrate(), gfunct();
double capacity, dissipation, longest, length, delay;
double tolerance, left, right;
tolerance = .0001;
left = 8.5;
right = 10.5;
capacity = rroot(left, right, tolerance);
printf("time when arrival rate equals capacity is %.1f\n\n", capacity);
left = 9.0;
dissipation = groot(left, right, tolerance);
printf("time when the queue dissipates is %.1f\n\n", dissipation);
left = 8.0;
longest = maximize(left, dissipation, tolerance);
length = gfunct(longest);
printf("time when the longest queue occurs is %.1f\n\n", longest);
printf("length of longest queue is %.0f\n\n", length);
delay = integrate(left, dissipation);
printf("total dalay time is %.0f hours\n\n", delay);
}
double integrate(a, b) /* Simpson's Rule */
double a, b;
{
double gfunct();
double dx, sum, x, integral;
int n = 20;
int i = 0;
dx = (b-a)/n;
sum = 0;
x = a;
while(i != n)
{
sum = sum + gfunct(x) + 4*gfunct(x+dx/2) + gfunct(x+dx);
x = x+dx;
i = i+1;
}
integral = sum*dx/6;
return(integral);
}
double rroot(l, r, tolerance) /* bisection */
double l, r, tolerance;
{
double rfunct();
double c;
c = (l+r)/2;
if ((r-l) <= tolerance)
return(c);
else if (rfunct(r)*rfunct(c) < 0.0)
rroot(c, r, tolerance);
else
rroot(l, c, tolerance);
return(c);
}
double groot (le, ri, tolerance) /* bisection */
double le, ri, tolerance;
{
double gfunct();
double c;
c = (le+ri)/2;
if ((ri-le) <= tolerance)
return(c);
else if (gfunct(ri)*gfunct(c) < 0.0)
groot(c, ri, tolerance);
else
groot(le, c, tolerance);
return(c);
}
double maximize(lef, rig, tolerance)
double lef, rig, tolerance;
{
double gderiv();
double m;
m = (lef+rig)/2;
if (gderiv(m) == 0.0 || (rig-lef) < tolerance)
return(m);
else if (gderiv(m) > 0.0)
m = maximize(m, rig, tolerance);
else
m = maximize(lef, m, tolerance);
return(m);
}
double rfunct(x)
double x;
{
double r;
r = -720*x*x + 12240*x - 44160;
return (r);
}
double gfunct(t)
double t;
{
double afunct();
double g;
g = afunct(t) - 3840*(t-8);
return (g);
}
double afunct(t)
double t;
{
double a;
a = -240*t*t*t + 6120*t*t -48000*t + 115200;
return (a);
}
double gderiv(t)
double t;
{
double aderiv();
double d;
d = aderiv(t) - 3840;
return (d);
}
double aderiv(t)
double t;
{
double d;
d = -240*3*t*t + 6120*t -48000;
return (d);
}