Я пытаюсь написать код, который принимает сумму каждого значения, но также печатает каждое значение по пути - PullRequest
0 голосов
/ 29 апреля 2020

Я хочу взять сумму различных уравнений, перечисленных ниже, от 1 до 100. Я получаю ошибку «Исключение с плавающей точкой: 8». Я не уверен, что я делаю неправильно.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(int argc, char** argv)
{
  double sk1[100]={0};
  double sk2[100]={0};
  double sk3[100]={0};
  double sk4[100]={0};
  for(int i=1;i<101;++i)
  {
    sk1[i-1]+=(1/i)-log(i);
    sk2[i-1]+=1/(i^2);
    sk3[i-1]+=1/(i^3);
    sk4[i-1]+=1/(i^4);
    printf("%e %e %e %e\n",sk1[i-1],sk2[i-1],sk3[i-1],sk4[i-1]);
  }
return 0;
}

Например, для sk1, код будет печатать (1/1) -log (1), затем (1/2) -log (2) ) + предыдущее значение и т. д.

Ответы [ 2 ]

1 голос
/ 29 апреля 2020

In C, ^ является побитовым оператором XOR, а не степенной функцией.

Во втором l oop, когда процессор пытается вычислить выражение

sk2[i-1]+=1/(i^2);

это фактически попытка делить на ноль!

(2 ^ 2) == (00000010 ^ 00000010) == 0

Что вы действительно хотите сделать, это использовать pow;

int main(int argc, char** argv)
{
  double sk1[100]={0};
  double sk2[100]={0};
  double sk3[100]={0};
  double sk4[100]={0};
  for(int i=1;i<101;++i)
  {
    sk1[i-1]+=(1/i)-log(i);
    sk2[i-1]+=1/pow(i, 2);
    sk3[i-1]+=1/pow(i, 3);
    sk4[i-1]+=1/pow(i, 4);
    printf("%e %e %e %e\n",sk1[i-1],sk2[i-1],sk3[i-1],sk4[i-1]);
  }
  return 0;
}
0 голосов
/ 29 апреля 2020

Ошибка в том, что вы используете ^. В C это не оператор power, а двоичный оператор XOR. Вместо этого вы можете использовать pow(base, exp), который уже включен в math.h

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...