#include "puolitus.h" #include #include TYPE puolitus( TYPE(*f)(TYPE), TYPE min, TYPE max) { TYPE mid, val, lastmin, lastmax, fmax; if (min>=max) { fprintf(stderr, "ERROR: min>=max\n"); exit(EXIT_FAILURE); } if ((f(min)>0) == ((fmax=f(max))>0)) { fprintf(stderr, "ERROR: f(min) and f(max) have same sign\n"); exit(EXIT_FAILURE); } for (;;) { mid = (min+max)/2; val = f(mid); #ifdef DEBUG printf("min=%.20f, max=%.20f, val(%.20f)=%.20f\n", min, max,mid,val); #endif if (val == 0) return mid; lastmin=min; lastmax=max; if ((val>0) == (fmax>0)) { if (max<=mid) return max; max=mid; } else { if (min>=mid) return min; min=mid; } } }