Stream
s, and especially IntStream
s, are an elegant way of implementing summation terms (∑). The ranges of the Stream
can be used as the bounds of the summation.
E.g., Madhava's approximation of Pi is given by the formula (Source: wikipedia):
This can be calculated with an arbitrary precision. E.g., for 101 terms:
double pi = Math.sqrt(12) *
IntStream.rangeClosed(0, 100)
.mapToDouble(k -> Math.pow(-3, -1 * k) / (2 * k + 1))
.sum();
Note: With double
's precision, selecting an upper bound of 29 is sufficient to get a result that's indistinguishable from Math.Pi
.