ニュートン法による平方根・立方根

-- 平均値
myaverage x y = (x + y) / 2



-- 平方根
mysqrt x = let
           {
             good_enough guess y   = ( abs((guess*guess - y) / y) < 1e-10 )
             ; val_improve guess y = myaverage guess (y/guess)
             ; sqrt_iter guess y   = if (good_enough guess y)
                                       then guess
                                       else sqrt_iter (val_improve guess y) y
           } in sqrt_iter 1.0 x
  • 立方根

平方根とほとんど同じ。

-- 立方根
mycbrt x = let
           {
             good_enough guess y   = ( abs((guess**3 - y) / y) < 1e-10 )
             ; val_improve guess y = ( y/(guess**2) + 2.0*guess ) / 3.0
             ; cbrt_iter guess y   = if (good_enough guess y)
                                       then guess
                                       else cbrt_iter (val_improve guess y) y
           } in cbrt_iter 1.0 x