Я новичок в stackoverflow, но я попытался найти ответ и не смог его найти. Я тоже не могу понять это сам. Итак, для школьного проекта C++ нам нужно найти область под кривой. У меня есть все формулы, жестко закодированные, так что не беспокойтесь об этом. И поэтому предполагается, что программа даст более высокий результат с более высоким значением для (n). Но кажется, что когда я ставлю значение для (n) выше, чем (b), программа просто зацикливает 0 и не заканчивается. Не могли бы вы, ребята, помочь мне, пожалуйста. Спасибо. Вот код:
/* David */
#include <iostream>
using namespace std;
int main()
{
cout << "Please Enter Lower Limit: " << endl;
int a;
cin >> a;
cout << "Please Enter Upper Limit: " << endl;
int b;
cin >> b;
cout << "Please Enter Sub Intervals: " << endl;
int n;
cin >> n;
double Dx = (b - a) / n;
double A = 0;
double X = a;
for (X = a; X <= (b - Dx); X += Dx)
{
A = A + (X*X*Dx);
X = X * Dx;
cout << A << endl;
}
cout << "The area under the curve is: " << A << endl;
return 0;
}
a
, b
, n
- целые числа. Итак, следующее:
(b - a) / n
вероятно, 0. Вы можете заменить его:
double(b - a) / n
Поскольку все переменные в (b - a)/n
являются int
, вы выполняете целочисленное деление, которое отбрасывает фракции в результате. Присвоение double
не меняет этого.
Вы должны преобразовать хотя бы одну из переменных в double
чтобы получить результат с плавающей запятой с сохраненными фракциями:
double Dx = (b - a) / (double)n;
Вы выполняете целочисленное деление. Целочисленное деление будет возвращать только целые числа, отрезая десятичное число:
3/2 == 1 //Because 1.5 will get cut to 1
3/3 == 1
3/4 == 0 //Because 0.5 will get cut to 0
Вы должны иметь хотя бы одно из двух значений слева или справа от "/" - десятичный тип.
3 / 2.0f == 1.5f
3.0f / 2 == 1.5f
3.0f / 2.0f == 1.5f
Другие ответы верны. Ваша проблема, вероятно, является целым делением. Вы должны бросить операнды, чтобы удвоить.
Но вы должны использовать static_cast <> вместо C-style cast. А именно использование
static_cast<double>(b - a) / n
вместо double(b - a)/n
или ((double) (b - a))/n
.
-Wold-style-cast
их отсутствие позволяет вам включить флаги компиляции, например -Wold-style-cast
которые могут помочь вам обнаружить случайные приведения в стиле C, которые могут быть более подвержены ошибкам, чем int, чтобы удваиваться.
X = X * Dx;
Для чего этот? Это не имеет особого смысла.