fork download
  1. object Main extends App {
  2. def sqrt(x: Double) = {
  3. def sqrtIter(lastDiff: Double, guess: Double): Double = {
  4. val improved = improve(guess)
  5. val diff = computeDiff(improved)
  6. if (diff < lastDiff) {
  7. sqrtIter(diff, improved)
  8. } else {
  9. guess
  10. }
  11. }
  12. def computeDiff(guess: Double) = math.abs(square(guess) - x)
  13. def square(num: Double) = num * num
  14. def improve(guess: Double) = (guess + x / guess) / 2
  15. sqrtIter(Double.PositiveInfinity, 1.0)
  16. }
  17.  
  18. Seq(
  19. math.sqrt(2),
  20. sqrt(2),
  21. math.sqrt(0.001),
  22. math.sqrt(0.1e-20),
  23. math.sqrt(1.0e20),
  24. math.sqrt(1.0e50),
  25. sqrt(0.001),
  26. sqrt(0.1e-20),
  27. sqrt(1.0e20),
  28. sqrt(1.0e50)
  29. ).foreach(println)
  30. }
  31.  
Success #stdin #stdout 0.41s 323200KB
stdin
Standard input is empty
stdout
1.4142135623730951
1.414213562373095
0.03162277660168379
3.1622776601683794E-11
1.0E10
1.0E25
0.03162277660168379
3.162277660168379E-11
1.0E10
1.0E25