Printf печать подозрительно большой поплавок - PullRequest
0 голосов
/ 29 мая 2019

Так что в настоящее время я пытаюсь напечатать массив с плавающей точкой (float *), содержащий некоторые неинициализированные значения с плавающей точкой. Каким-то образом в моей консоли отображаются такие значения (используя «% d:% f \ n» в качестве формата):

-0.000000
0.000000
68509253839697691852885035134612406272.000000
0.000000
-0.000000
0.000000

Это не имеет смысла для меня. Как плавание может быть таким длинным? Кроме того, в очень похожей ситуации, когда я использую sprintf с форматом «% 5.1f» для «toString» матрицы, моя программа прерывается («строка 11: 1294 Прерывание прерывания: 6»):

void mat_print(char * buf, matptr_t mat) {
  char numbuf[10] = {0};
  strcpy(buf, "");

  for(uint32_t y = 0, ystop = mat->h; y < ystop; y++) {
    strcat(buf, y == 0? "[ " : "\n[ ");
    for(uint32_t x = 0, xstop = mat->w; x < xstop; x++) {
      // on x = 2, i get an abort
      sprintf(numbuf, "% 5.1f ", mat_get(mat, y, x));
      strcat(buf, numbuf);
    }
    strcat(buf, "]");
  }
}

здесь я пытаюсь получить значение из объекта матрицы

struct matrix {
  uint32_t h, w;
  float * matrix;
};
typedef struct matrix * matptr_t;

с функцией mat_get

inline float mat_get(matptr_t mat, uint32_t y, uint32_t x) {
  return mat->matrix [y * mat->w + x];
}

массив указателей с плавающей запятой матрицы указывает на выделенную область рядом с самой матрицей, все это выделяется за один раз:

matptr_t matrix(uint32_t h, uint32_t w) {
  // nn_allocator is a function pointer to malloc
  matptr_t mat = (matptr_t) nn_allocator(sizeof(struct matrix) + h * w * sizeof(float));
  mat->h = h;
  mat->w = w;
  mat->matrix = (void *)mat + sizeof(struct matrix);
  return mat;
}

большие поплавки напечатаны:

// matptr is a pointer to a matrix object
float * values = (matptr)->matrix;
for(uint32_t i = 0, stop = (matptr)->w * (matptr)->h; i < stop; i++, values++) {
  printf("%d: %f\n", i, *values);
}

Итак, вопрос: Как можно исправить этот код, чтобы он больше не прерывал мою программу и почему этот float такой длинный?

Заранее спасибо за любую помощь.

...