{-diff :: (Float->Float)->(Float->Float)
diff f = g
     where g x = (f(x+delta)-f x)/delta
           delta = 1.0e-3-}

diff f x = (f(x+delta)-f x)/delta
           where delta = 1.0e-3

multi_diff :: Float->(Float->Float)->(Float->Float)
multi_diff d f x = (f(x+d)-f x)/d

coarse_diff = multi_diff 10.0
fine_diff = multi_diff 1.0e-3

volume :: Float->Float->Float->Float
volume l b h =l*b*h

regenmenge = volume 1 1

{-is_double :: Int->Int->Bool
a `is_double` b = a == 2*b
infix 4 `is_double`-}

{-newton :: (Float->Float)->Float->Float
newton f x
   |abs(f x) < 0.001 = x  -- Feierabend wenn gut genug
   |otherwise        = newton f (x - f x / diff f x) -- weiter-}

repeat_until::(a->Bool)->(a->a)->a->a
repeat_until crit change x
   |crit x    = x                                   --zufrieden
   |otherwise = repeat_until crit change (change x) --weiter

newton :: (Float->Float)->Float->Float
newton f x = repeat_until n_crit n_change x
   where n_crit x = abs(f x) < 0.001
         n_change x = x - f x / diff f x


inverse:: (Float->Float)->Float->Float->Float
inverse f y x = newton g x
   where g x = f x - y    

tabulate :: Float->Float->Int->(Float->Float)->[Float]
tabulate start step times f
 |times <=0 = []  
 |otherwise = (f start):(tabulate (start+step) step (times-1) f)  

