Накопительная сумма в C вздувается до бесконечности - PullRequest
0 голосов
/ 19 декабря 2018

Я, как правило, пользователь R, но я пытаюсь использовать C для некоторых сумм и умножений более низкого уровня.

Я пытаюсь сгенерировать кумулятивную сумму эта и сохраняю результат в tmp0 .Однако, когда я вывожу tmp0 , это либо дает мне Inf, NaN, либо какое-то произвольно большое число.Я дважды проверил ту же накопленную сумму в R, и она отлично работает;Я не уверен, почему C не справляется с этим.Ниже приведен код, который я использую:

   int i,j;
   const int p = ncov,  n = nin;
   double accNum0[n]; //accumulate first part of likelihood sum eta_i
   double accNum1[n]; //accumulate the backwards numerator
   double accNum2[n]; //acumulate the forward numerator (weighted)
   double tmp0 = 0;

  double eta[n]; //calculate linear predictor in this step (X %*% beta)
  for(i = 0; i < n; i++) {
    for (j = 0; j < p; j++)
      eta[i] += b[j] * x[n * j + i];
  }

  for (i = 0; i < n; ++i) {
    tmp0 += eta[i];
  }

  return (tmp0);

Опять же, я довольно новичок в C, поэтому, возможно, я делаю некоторые ошибки новичка и буду очень признателен за любые (и все) предложения!

1 Ответ

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

Возможны ошибки при инициализации b или x.Однако одна определенная ошибка заключается в том, что eta используется неинициализированным.Это означает, что eta[i] может начинаться с некоторого произвольного значения вместо 0, как вы, вероятно, ожидаете.

Добавьте инициализацию перед накоплением в ней.

  for(i = 0; i < n; i++) {
    eta[i] = 0;
    for (j = 0; j < p; j++)
      eta[i] += b[j] * x[n * j + i];
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...