Здесь есть несколько больших проблем. Во-первых, вы используете std::cout
для печати значения, а std::cout
по умолчанию печатает только 6 цифр. Во-вторых, вы объявили Pi как int64_t
. Это означает, что вы получите не более 1 цифры точности, поскольку Pi - целое число. Вы должны иметь его как тип с плавающей точкой.
Так сколько цифр вы получите от каждого типа?
- 6 цифр от
float
- 15-16 цифр от
double
- 20 цифр от
long double
в clang и gcc, но только 15-16 в Visual Studio
- Около 30 цифр от GCC
__float128
, хотя это работает только на GCC
Если вам нужна более высокая точность, вам придется использовать высокоточную арифметическую библиотеку, которая дает вам больше цифр, симулируя ее. Это будет не так быстро, но сработает.
Вы можете поиграть с точностью до каждого типа, используя этот код. Я настроил calculatePi
на тип, так что вы можете просто вставить float
, double
, long double
или __float128
. Он напечатает 20 цифр. Этот код должен правильно печатать все 20 цифр для __float128
.
#include <cstdio>
using namespace std;
template<class Float>
Float calculatePi(size_t iterations) {
Float y = 2;
Float Pi = 3;
const Float two = 2;
const Float four = 4;
const Float one = 1;
for(size_t i = 0; i < iterations; i++) {
Pi += four / (y * (y + one) * (y + two));
y += two;
Pi -= four / (y * (y + one) * (y + two));
y += two;
}
return Pi;
}
int main(){
long double result = calculatePi<long double>(1000000);
printf("Expected: 3.14159265358979323846\n");
printf("Actual: %.20Lf", result);
}