Неправильно описано условие цикла

159
22 апреля 2022, 18:20

Перевод задания : найти x используя формулу, с точностью задаваемой пользователем, значение a , p ввести с клавиатуры.

Вот мой код на плюсах:

#include <iostream>
#include<math.h>
#include <vector>
int main() {
    float precision = 0, a = 0, p = 0;
    int counter = 0, n = 1;
    std::vector<float> vec_x = {1, 1};
    std::cout << "Enter a value of precision : " << std::endl;
    std::cin >> precision;
    std::cout << "Enter a value of a : " << std::endl;
    std::cin >> a;
    std::cout << "Enter a value of p : " << std::endl;
    std::cin >> p;
    for (counter; abs(vec_x[counter] - vec_x[n]) < precision; counter++)
    {
        vec_x.push_back(vec_x[n] / pow(p, 2) * (pow(p, 2) - 1) + 1 / 2 * (p + 1) * a / pow(vec_x[n], p) - (1 / 2) * (p + 1) * pow(vec_x[n], p) / p);
        n++;
        std::cout << vec_x[n] << std::endl;
    }
    return 0;
}

Как всё должно было работать: создаётся вектор x-ов, создаются переменные, в них записываем значения с клавиатуры, цикл проверяет условие: |x1 - x2| > precision, пока условие верно находит следующий x, выводит на экран, проверяет условие уже для нового x и так пока не выйдет с цикла. Но программа проходит один раз и после этого выходит. Отладчик показывает, что 0.888889 < 0.0001 при вводе данных: 0.0001 , 2 , 3. Помогите, пожалуйста, правильно написать условие цикла.

Answer 1
  1. Вместо abs, нужно использовать fabs или std::abs, abs - только для целочисленных.

  2. Условие в цикле — это условие продолжения, а не условие выхода. Поэтому нужно проверять, что разница больше необходимой точности: fabs(a-b)>precision

  3. У вас какая-то проблема с формулой, мало того, что вы забыли большие скобки(которые квадратные), так и то, что я смог распарсить с этой картинки, не даёт корректного результата.

Воспользуюсь итерационным алгоритмом из Википедии

#include <iostream>
#include <cmath>
#include <tuple>
double solve(double a, double p, double precision) {
    double prev, cur = 1;
    do {
        std::tie(prev, cur) = std::make_tuple(cur, ((p-1) * cur + a/std::pow(cur, p-1)) / p);
    } while (std::abs(cur - prev) > precision);
    return cur;
}
READ ALSO
Кодировка ASCII в Xcode

Кодировка ASCII в Xcode

В Xcode при вводе русского символа в переменную типа char, если сразу же вывести эту самую переменную, выводит \320 или что-то похожее

130
Объединить python(gui) и C++

Объединить python(gui) и C++

У меня есть программа которая работает с файлами, все готово кроме интерфейса, я бы его спокойно могла бы доделать на C++, но сроки поджимаютМожно...

146
Как найти сумму ряда? [дубликат]

Как найти сумму ряда? [дубликат]

Дано натуральное число x и количество рядов равное 5 как вывести сумму ряда?

124
clang парсинг комментариев

clang парсинг комментариев

Начал изучения библиотеки clang для парсинга кодаМне необходимо найти все комментарии

275