I would not do this in a floating point at all.
Recall that your algorithm:
(1 + 1 / (2 * 1 + 1)) *
(1 + 2 / (2 * 2 + 1)) *
(1 + 3 / (2 * 3 + 1)) *
(1 + 4 / (2 * 4 + 1)) *
(1 + 5 / (2 * 5 + 1)) *
(1 + 6 / (2 * 6 + 1)) *
(1 + 7 / (2 * 7 + 1)) * ...
Each step along the way you calculate the fraction. Why not just keep this fraction in the form of a numerator / denominator? The fraction you want to calculate:
(4 / 3) *
(7 / 5) *
(10 / 7) *
(13 / 9) * ...
which is only 4 * 7 * 10 * 13 ... above and 3 * 5 * 7 * 9 below.
BigInteger ( 4.0 System.Numerics), , . . , . , , . , .