Ошибка Stack around the variable 'Y' was corrupted в С++
Вот задание: Вычислить 12 значений функции y = ax^2 + bx + c на отрезке [e,f], сохранить их в массиве Y и определить, является ли функция нисходящей, растущей или немонотонной на этом отрезке. Моя реализация:
#include <iostream>
#include <cmath>
using namespace std;
double input_failsafe(const char cout_string[] = "")
{
double out;
while (true)
{
cout << cout_string;
cin >> out;
if (cin.fail())
{
cout << "Wrong input" << endl;
cin.clear();
cin.ignore(32767, '\n');
}
else
{
cin.ignore(32767, '\n');
return out;
}
}
}
int main()
{
cout << "Task 1" << endl;
cout << "1D Array" << endl;
double x, y, a, b, c, e, f, step;
const int n = 12;
bool pos = false, neg = false;
double Y[n];
a = input_failsafe("Print a: ");
b = input_failsafe("Print b: ");
c = input_failsafe("Print c: ");
e = input_failsafe("Print e: ");
f = input_failsafe("Print f: ");
if (f <= e)
{
do {
cout << "Wrong input. f must be greater than e\n";
f = input_failsafe("Print f: ");
} while (f <= e);
}
step = (f - e) / 12;
x = e;
cout << "\ny = ax^2 + bx + c " << "range [" << e << ";" << f << "]\n\n" << "Array Y: \n\n";
for (int i = 0; i < n, x < f; i++)
{
y = a * pow(x, 2) + b * x + c;
Y[i] = y;
cout << Y[i] << " ";
x += step;
}
for (int i = 0; i < 11; i++)
{
if (Y[i] < Y[i + 1])
{
pos = true;
}
if (Y[i] > Y[i + 1])
{
neg = true;
}
}
cout << "\n\nFunction:";
if (pos && neg)
{
cout << "\nThe function is not monotonous" << endl;
}
else
{
if (pos)
{
cout << "\nIncreasing function" << endl;
}
if (neg)
{
cout << "\nDecreasing function" << endl;
}
}
system("pause");
return 0;
}
Суть проблемы:
Вроде бы код рабочий, но если ввести какие-то определенные значения(как на скриншоте(я ввел отрезок [1;15])), то компилятор выдаст ошибку Stack around the variable 'Y' was corrupted, а программа выведет не 12, как было нужно, а 13 значений.

Ответы (1 шт):
Вот здесь
for (int i = 0; i < n, x < f; i++)
у вас использован оператор запятая, т.е. условие i<n игнорируется, и работает только условие x < f. Но при работе с числами с плаваящей запятой специфика их представления в памяти с ограниченной точностью запросто может привести к тому, что у вас будет не n, а n+1 итерация и вы выйдете за границы массива. Не при всех значениях, как вы сами заметили.
И еще вот это
y = a * pow(x, 2) + b * x + c;
лучше переписать как
y = (a*x + b)*x + c;
