Roade mig med att köra beräkningen manuellt, alltså ett steg i taget, kopiera, klistra in...
Efter 27 eller 28 varv kom min kod fram till att kvadratroten ur 10000000000000 = 3162277.6601683795 vilket råkar vara samma svar som den inbyggda funktionen sqrt ger.
Men min kod kvarderar svaret i en kontroll
Kod:
| (((s+a/s)/2)**2-a) < 0.000000000001 = (s,n+1)
och 3162277.6601683795^2 - 10000000000000 = 1.953125e-3 ≈0.002
vilket är mer än 0.000000000001.
Då går samma tal in i algoritmen igen, och igen...
La in
en ny guard som "nödstopp", bör ge tillräckligt bra resultat för duktigt stora tal:
Kod:
sqrt' :: (Floating a, Ord a) => a -> (a,Int)
sqrt' a = f a (1,0)
where
f a (s,n)
| (((s+a/s)/2)**2-a) < 0.000000000001 = (s,n+1)
| n > 100 = (s,n+1)
| otherwise = f a (((s+a/s)/2),n+1)
sqrt' 10000000000000 = (3162277.6601683795,102)