Bonjour à tous,
Dans un programme, je dois réaliser la moyenne de points. Cependant, je remarque que lorsque la somme des coordonnées est négative et que je divise pas la taille le résultat est faux par exemple -151/7812 = 2361334366834299. Est ce que vous savez d'où cela peut provenir ?
Merci d'avance
Code:Voici mon code : #include <stdio.h> #include <stdlib.h> #include <stdint.h> #include <string.h> #include <inttypes.h> #include "../headers/point.h" #include "../headers/cluster.h" #include "../headers/update_centroids.h" /** * @brief Met à jour les centroids des clusters en calculant la moyenne des points de chaque cluster. * * @param clusters Tableau de pointeurs vers les clusters * @param K Nombre de clusters * @return Tableau de pointeurs vers les clusters mis à jour */ cluster_t** update_centroids(cluster_t *clusters[], uint32_t K) { for (uint32_t i = 0; i < K; i++) { printf("nouvelle itération\n"); uint32_t dim = clusters[0]->data[0]->dim; int64_t *moyenne = calloc(dim, sizeof(int64_t)); if (moyenne == NULL) { fprintf(stderr, "Memory allocation failed\n"); exit(EXIT_FAILURE); } if (clusters[i]->size < 1) { fprintf(stderr, "Size of cluster less than 1: division by zero\n"); continue; // Passer à l'itération suivante si la taille du cluster est inférieure à 1 } for (uint64_t yi = 0; yi < clusters[i]->size; yi++) { for (uint32_t xi = 0; xi < dim; xi++) { moyenne[xi] += clusters[i]->data[yi]->coords[xi]; } } printf("%d\n", i); printf("update moyenne[0] = %" PRId64 "\n", moyenne[0]); printf("update moyenne[1] = %" PRId64 "\n", moyenne[1]); for (uint32_t xi = 0; xi < dim; xi++) { moyenne[xi] = (int64_t) ((uint64_t)moyenne[xi]/clusters[i]->size); printf("Taille du cluster %d après mise à jour des centroïdes : %" PRIu64 "\n", i, clusters[i]->size); printf("update moyenne[xi] = %" PRId64 "\n", moyenne[xi]); clusters[i]->centroide.coords[xi] = moyenne[xi]; // Mise à jour du centroïde clusters[i]->centroide.dim = dim; } printf("Centroid %d after update: [", i); for(int l = 0; l < dim; l++){ printf("%" PRId64, clusters[i]->centroide.coords[l]); if (l < dim - 1) printf(", "); } printf("]\n"); free(moyenne); // Libérer la mémoire allouée pour moyenne } return clusters; }
-----