Я вычисляю pi, используя длинную формулу. Я пытаюсь получить больше знакомы с числами с плавающей запятой и т. Д. У меня есть рабочая программа, которая использует удвоения. Проблема с моим кодом:Использование длинного двойного или просто двойного для вычисления pi?
- Если я использую double, pi только точный до 7-го знака после запятой. Я не могу понять, что это более точно.
- Если я использую длинный двойник, то pi точнее вплоть до девятого десятичного разряда, однако код занимает намного больше времени для запуска. Если я проверяю точность менее 0,00000001 с использованием длинного двойника, pi возвращает значение 9.4246775. Я предполагаю, что это связано с длинным удвоением.
Мой вопрос - это самый точный тип переменной? Как я могу изменить свой код, чтобы улучшить точность pi?
Вот мой код:
#include <iomanip>
#include <cstdlib>
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double arctan;
double pi;
double precision;
double previous=0;
int y=3;
int loopcount=0;
cout<<"Start\n";
arctan=1-(pow(1,y)/y);
do
{
y=y+2;
arctan=arctan+(pow(1,y)/y);
y=y+2;
arctan=arctan-(pow(1,y)/y);
pi=4*(arctan);
// cout<<"Pi is: ";
// cout<<setprecision(12)<<pi<<endl;
precision=(pi*(pow(10,10)/10));
loopcount++;
if(precision-previous<0.000000001)
break;
previous=precision;
}
while(true);
cout<<"Pi is:"<<endl;
cout<<setprecision(11)<<pi<<endl;
cout<<"Times looped:"<<endl;
cout<<loopcount<<endl;
return 0;
}
Вам следует рассмотреть возможность переключения на представление с фиксированной точкой, если вы хотите жестко контролировать точность. –
Когда вы изменили на 'long double', вы изменили _all_ вызовы API, например. 'pow()' to 'powl()', 'arctan()' в 'atanl()' -эквивалент и т. д.? – sarnold
Дуг, не могли бы вы объяснить это? Я не знаком с этим. – adohertyd