Моя школа дает мне задание для вычисления пи.
Результат должен быть:
Question 4
Accuracy set at : 1000
term pi
1 4
100 3.13159
200 3.13659
300 3.13826
400 ...
... ...
Результат в моей программе:
term pi
1 4
100 3
200 3
300 3
400 ...
... ...
Я предполагаю, что когда я делаю (4 / знаменатель), результат потеряет десятичное число, хотя я изменил некоторые объявления типа данных с int на double.
(Некоторые сайты говорят мне сделать это.)
Возможно я делаю это неправильно.
Как я могу справиться с этой проблемой?
Ниже моя программа.
#include <iostream>
using namespace std;class Four
{
private:
int inputedAccuracy;
double pi;
int denominator;
int doneTermCounter;
double oneTerm;
int negativeController;
public:
double question4()
{
cout << "Accuracy set at : " ;
cin >> inputedAccuracy;
cout << endl;
pi = 0.0;
denominator = 1.0;
doneTermCounter = 0;
negativeController = 1;
cout << "Term" << " " << "pi" << endl;
cout << "1 " << " " << "4" << endl;for (inputedAccuracy; inputedAccuracy > 0; inputedAccuracy -= 100)
{
for (int doneTerm = 0; doneTerm < 100; doneTerm++)
{
pi = pi + (negativeController * 4 / denominator);
negativeController *= -1;
denominator += 2;
doneTermCounter++;
}
if (doneTermCounter >= 10000)
cout << doneTermCounter << " " << pi << endl;
else
if (doneTermCounter >= 1000)
cout << doneTermCounter << " " << pi << endl;
else
cout << doneTermCounter << " " << pi << endl;
}
return 0.0;
}
};
Спасибо за внимание!
pi = pi + (negativeController * 4 / denominator);
(negativeController * 4 / denominator)
выражение приводит к int
потому что оба negativeController
а также denominator
являются int
, Другими словами, вы делаете целочисленное деление, которое объясняет, почему вы не получаете ожидаемый результат.
Объявите любой (или оба) из них как double
форсировать деление с плавающей точкой.
Я думаю, что меняется negativeController
а также denominator
в int
будет делать трюк, поскольку подвыражение оценивается на целых числах, таким образом теряя точность.
pi = pi + (negativeController * 4 / denominator);
В этой строке у вас есть целочисленное деление (потому что оба операнда /
имеют тип int
), что означает, что дробная часть результата деления отбрасывается.
Чтобы использовать деление с плавающей запятой, должен быть хотя бы один операнд / сторона float
или же (long) double
, Самым простым способом достижения этого в этом случае будет изменение 4
(литерал типа int
) чтобы 4.0
(литерал типа double
):
Затем при расчете результата *
, negativeController
также будет преобразован в double
(обычные арифметические преобразования), уступая double
как левый операнд /
что в свою очередь вызывает denominator
(rhs) также должен быть преобразован в double
и так далее.