I'm taking my first steps in the Scala world, though I'm not wholly unfamiliar with functional style.Apparently one way of calculating Pi is to sum the terms of the infinite series:$$4 * (\frac{1}{1} - \frac{1}{3} + \frac{1}{5} - \frac{1}{7} + \frac{1}{9} \dots)$$So I wrote this simple implementation in a Scala worksheet:def calculatePi(tolerance: Double): Double = {  val s1 = Iterator.continually(List(4.0, -4.0)).flatten  val s2 = Iterator.from(0).map(_ * 2 + 1)  s1.zip(s2).map(p => p._1 / p._2).takeWhile(math.abs(_) > tolerance).sum}var tolerance = 1.0while (tolerance > .0000001) {  val approximation = calculatePi(tolerance)  val error = math.abs(math.Pi - approximation)  println(stol:$tolerance calc:$approximation error:$error within:${error < tolerance})  tolerance /= 10}Any thoughts? If possible can anyone address these:Is Iterator really the best choice here? Stream? Something else?I'm particularly unhappy about the snippet map(p => p._1 / p._2); it feels like I'm missing a better way to do that.Is there a better/different way to do the tolerance while loop?From an algorithm standpoint, I have to decide when to stop taking values from the sequence. Is math.abs([TERM]) < tolerance a good stopping point? Or is there a better, earlier termination point?Note: I don't really care about the println statement. It's kinda ugly but it's just there for diagnostics.
Calculating Pi to a tolerance
scala;numerical methods