docs: public static double root(double eps, int maxIterations, double a, double b, Function1D f)
      {
          if(b <= a)
              throw new ArithmeticException("a musbt be < b for Bisection to work");
          
          double fb = f.f(b);
          double fa = f.f(a);
          
          if(fa* fb >= 0)
              throw new ArithmeticException("The given interval does not appear to bracket the root");
     
          while(b - a > 2*eps && maxIterations-- > 0)
          {
              double midPoint = (a+b)*0.5;
              double ftmp = f.f(midPoint);
              
              if(fa*ftmp < 0)
              {
                  b = midPoint;
                  fb = ftmp;
              }
              else if(fb * ftmp < 0)
              {
                  a = midPoint;
                  fa = ftmp;
              }
              else
                  break;//We converged
          }
          
          return (a+b)*0.5;
      }