This is zero.c in view mode; [Download] [Up]
#include <math.h> static void *func; static double zfun(double z) { void *args[1], *values[1]; double zz[1], *result; char *mode[1]; long length[1]; mode[0] = "double"; length[0] = 1; args[0] = (void*)(zz); zz[0] = z; call_S(func, 1L, args, mode, length, 0L, 1L, values); result = (double*)values[0]; return result[0]; } static double zero_approx(double(*f)(), double x0, double x1, double tol) { double f0, f1, fc, xc; f0 = zfun(x0); f1 = zfun(x1); if(f0 == 0.0) return x0; if(f1 == 0.0) return x1; if(f0*f1 > 0.0) error("x[0] and x[1] have the same sign\n"); if(tol <= 0.0) error("non-positive tol value\n"); for(;;) { xc = 0.5*(x0+x1); if(fabs(x0-x1) < tol) return xc; fc = zfun(xc); if(fc == 0) return xc; if(f0*fc > 0.0) { x0 = xc; f0 = fc; } else { x1 = xc; f1 = fc; } } } zero_find(void *f, double *x, double *tol) { func = f; x[0] = zero_approx(zfun, x[0], x[1], tol[0]); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.