Я бы не стал делать это с плавающей запятой вообще.
Напомним, что ваш алгоритм:
(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)) * ...
На каждом этапе пути вы вычисляете дробь. Почему бы просто не сохранить эту дробь в форме числителя / знаменателя? Фракция, которую вы хотите вычислить:
(4 / 3) *
(7 / 5) *
(10 / 7) *
(13 / 9) * ...
, что составляет всего 4 * 7 * 10 * 13 ... сверху и 3 * 5 * 7 * 9 снизу.
Получите себе класс BigInteger (поставляется с платформой 4.0 в System.Numerics), и вы можете легко вычислить числитель и знаменатель настолько большого, насколько вам нужно. Тогда у вас просто есть проблема преобразования частного в десятичное. Ну, это достаточно просто. Предположительно вы знаете, как сделать длинное деление . Просто внедрите длинный алгоритм деления на числитель и знаменатель, который выплевывает желаемое количество цифр.