Неправильный расчет мощностей - C - PullRequest
0 голосов
/ 08 декабря 2018
#include <stdio.h>
#include <math.h> 
#define M_E 2.71828

double a, b, c;
double d;

void main() 
{
  scanf("%lf", &a);
  scanf("%lf", &b);
  for (int i = 1; i <= 40; i++)
  {
    c = a * pow(M_E,(1/(double)i+1)) + (1/b);
    printf("%lf\n", c);
  }  
}

Я получаю неправильные значения для переменной c, не знаю почему.Попробовал обойти брекетинг и попытался избежать функции pow(), не зная, что еще можно попробовать.

-> Мне нужно, чтобы мой код отражал следующую формулу:

a * e^(1/(i+1)) + (1/b)

Из комментария Если я введу значение для a как 2 и для b как 2- Я должен получить 3.79744 ... но я получаю 6.074.

Ответы [ 3 ]

0 голосов
/ 08 декабря 2018

Ошибка в

1/(double)i+1

, которая должна быть

1/((double)i+1)

или даже

1.0 / (i + 1)
0 голосов
/ 08 декабря 2018

Неправильное кодирование формулы

Для отражения следующей формулы: a * e ^ (1 / (i + 1)) + (1 / b) .`

Добавьте 1, затем разделите.

//                     v------------v 
// c = a * pow(M_E,(   1/ (double)i+1   )) + (1/b);
c    = a * pow(M_E,(   1/((double)i+1)  )) + (1/b);

Результат соответствует цели OP Я должен получить 3.79744 ... .

3.797441

С болееточный e, код может получить более точный результат.

#define M_E 2.7182818284590452353602874713527
// output
3.797443
0 голосов
/ 08 декабря 2018

Ваш код дает ожидаемый результат.Вы, вероятно, ожидаете неправильные значения.Я переставил скобки в вашем выражении для c, чтобы показать, что на самом деле происходит.

Вам также следует заменить pow на функцию exp, поскольку вы по сути берете экспоненту.Посмотрите, как новая переменная d вычисляется в приведенном ниже коде.

Я также переместил оператор printf внутри цикла, чтобы вывести все значения.Заголовок <math.h> определенно требуется, и вам не нужно переопределять M_E, он уже определен в заголовке с гораздо большей точностью, чем у вас.

Я отредактировал код, чтобы он соответствовалновые требования c = a * e^(1/(i+1)) + (1/b).

#include <stdio.h>
#include <math.h> // This is necessary!!

double a, b, c;

double d;

int main(int argc, char *argv[])
{
scanf("%lf", &a);
scanf("%lf", &b);
for (int i = 1; i <= 40; i++)
{
  c = a * pow(M_E, 1/(double)(i + 1)) + (1/b);
  d = a * exp(1/(double)(i+1)) + (1/b); //this is equal to c!
  printf("%e\n", c); //use %e to print doubles
}  
}
...