@Bratis4ka

Почему одни, незначащие скобочки, меняют ответ?

Писал программу, которая должна была посчитать рекурентную формулу.
У меня не сходились ответы. Я решил убрать одни скобочки и всё сошлось.
Объясните, пожалуйста, чем 1 формула отичается от 2ой?
Почему по первой формуле один ответ, а по второй другой?
Может проблема была в приоритете операций?

1)a = a * (-x)*(2*i+1)/(2*i);
2)a = a * (-x)*((2*i+1)/(2*i));

Значение по контрольной формуле должно быть равно сумме с учётом погрешности.
Язык C++:
#include <iostream>
#include <stdio.h>
#include <math.h>

using namespace std;

int main()
{
    double s,x,e,a,y;
    int i = 1;
    cout<<"Аргумент: "<<endl;
    cin>>x;
    cout<<"Погрешность: "<<endl;
    cin>>e;

    a = 1;
    s = a;
    y= 1/sqrt(pow((1+x),3));

    while(e <= abs(a))
    {
        a = a *(-1*x)*((2*i+1)/(2*i));
        s +=a;
        i++;
    }

    cout<<"Сумма ряда"<<endl;
    cout<<s<<endl;
    cout<<"Контрольная формула "<<endl;
    cout<<y;

    return 0;
}
  • Вопрос задан
  • 104 просмотра
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
(-x)*(2*i+1)/(2*i) - вещественное число умножается на целое, результат вещественный, затем вещественное число делится на вещественное, результат вещественный.
(-x)*((2*i+1)/(2*i)) - целое число делится на целое, результат целое, затем вещественное число умножается на целое, результат вещественный.
Ответ написан
Комментировать
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
У вас i - целое, а x - вещественное. При делении целого на целое идет деление нацело (с округлением вниз до целого). При делении целого на вещественное или вещественного на целое - результат вещественное.

Если лишние скобки поставить, то у вас сначала происходит деление нацело (2*i+1)/(2*i), а потом домножение на вещественное.
Без скобочек операции выполняются слева направо - a *(-1*x)*(2*i+1) даст вещественный результат, который точно поделится.

Если вы в скобочках приведете к вещественному, то у вас тоже все заработает: a = a *(-1*x)*((2*i+1.0)/(2*i));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы