double — Как я могу получить результат с десятичным числом в делении? C ++, Pi

Моя школа дает мне задание для вычисления пи.

Результат должен быть:

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;
}
};

Спасибо за внимание!

0

Решение

pi = pi + (negativeController * 4 / denominator);

(negativeController * 4 / denominator) выражение приводит к int потому что оба negativeController а также denominator являются int, Другими словами, вы делаете целочисленное деление, которое объясняет, почему вы не получаете ожидаемый результат.

Объявите любой (или оба) из них как double форсировать деление с плавающей точкой.

2

Другие решения

Вы должны изменить: —

int denominator; в

double denominator;

Увидеть Вот

1

Я думаю, что меняется negativeController а также denominator в int будет делать трюк, поскольку подвыражение оценивается на целых числах, таким образом теряя точность.

1

pi = pi + (negativeController * 4 / denominator);

В этой строке у вас есть целочисленное деление (потому что оба операнда / имеют тип int), что означает, что дробная часть результата деления отбрасывается.

Чтобы использовать деление с плавающей запятой, должен быть хотя бы один операнд / сторона float или же (long) double, Самым простым способом достижения этого в этом случае будет изменение 4 (литерал типа int) чтобы 4.0 (литерал типа double):

Затем при расчете результата *, negativeController также будет преобразован в double (обычные арифметические преобразования), уступая double как левый операнд / что в свою очередь вызывает denominator (rhs) также должен быть преобразован в double и так далее.

1
По вопросам рекламы [email protected]