-- Wurzelberechnung nach Newton eps::Float eps = 0.0001 -- gewünschte Genauigkeit gut::Float -> Float -> Bool gut a x = abs(x^2 - a) < eps -- x ~= sqrt a verbesser::Float -> Float -> Float verbesser a x = (x+a/x)/2 {- Es gilt: x <= sqrt a <= a/x oder x >= sqrt a >= a/x Daraus folgt (x+a/x)/2 ist eine bessere Approximation als x Beispielrechnung: Main> verbesser 2 1 1.5 Main> verbesser 2 1.5 1.41667 -} bis::(Float -> Bool) -> (Float -> Float) -> Float -> Float bis p f x = if p x then x else bis p f (f x) wurzel::Float -> Float wurzel a | a < 0 = error "wurzel nur für positive Zahlen definiert!" | otherwise = bis (gut a) (verbesser a) (a/2) {- Beispielrechnungen: Main> wurzel 4 2.0 Main> wurzel 2 1.414216 Main> wurzel 3 1.732051 Main> wurzel 9 3.000015 -} r :: Rational r = 3.1456789 s :: Float s = 3.1456789 x::Int y ::Float x = floor 5.6 y = fromIntegral x+6.7