Ошибка 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 значений. Stack around the variable 'Y' was corrupted.

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Mikhailo

Вот здесь

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;
→ Ссылка