Division C [Résolu]

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



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
");
        uint32_t dim = clusters[0]->data[0]->dim;
        int64_t *moyenne = calloc(dim, sizeof(int64_t));

        if (moyenne == NULL) {
            fprintf(stderr, "Memory allocation failed
");
            exit(EXIT_FAILURE);
        }

        if (clusters*->size < 1) {
            fprintf(stderr, "Size of cluster less than 1: division by zero
");
            continue; // Passer à l'itération suivante si la taille du cluster est inférieure à 1
        }

        for (uint64_t yi = 0; yi < clusters*->size; yi++) {
            for (uint32_t xi = 0; xi < dim; xi++) {
                moyenne[xi] += clusters*->data[yi]->coords[xi];
            }
        }

        printf("%d
", i);
        printf("update moyenne[0] = %" PRId64 "
", moyenne[0]);
        printf("update moyenne[1] = %" PRId64 "
", moyenne[1]);

        for (uint32_t xi = 0; xi < dim; xi++) {
            moyenne[xi] =  (int64_t) ((uint64_t)moyenne[xi]/clusters*->size); 
            printf("Taille du cluster %d après mise à jour des centroïdes : %" PRIu64 "
", i, clusters*->size);
            printf("update moyenne[xi] = %" PRId64 "
", moyenne[xi]);
            clusters*->centroide.coords[xi] = moyenne[xi]; // Mise à jour du centroïde
            clusters*->centroide.dim = dim; 
        }

        printf("Centroid %d after update: [", i);
        for(int l = 0; l < dim; l++){
            printf("%" PRId64, clusters*->centroide.coords[l]);
            if (l < dim - 1)
                printf(", ");
        }
        printf("]
");

        free(moyenne); // Libérer la mémoire allouée pour moyenne
    }
    return clusters;
}


probablement des conversion int64 => uint64 => int64

Oui vu que les moyennes sont convertis en uint64_t pour être calculées avant d'être reconverties en int64_t, c'est mal barré pour -151/7812

Bonsoir,
merci pour vos réponses ! je devrait donc laisser tout en int64 ? Dans le code précédent j'avais justement essayer de caster mais surement pas de la bonne manière Il faudrait peut être tous caster en int64 pour être sur de ne pas avoir de problème.

Merci d'avance.

Il faudrait surtout savoir pourquoi tu utilises des types non signés, pourquoi du 64 bits, etc.
Et caster est quelque chose qu'il faut faire le moins possible encore plus entre des signés et non signés.

update j'ai résolu le problème mercii pour votre aide mais maintenant mon programme killed je vais essayer de régler ça

Bonjour,

Outre cette histoire de nombres signés et non signés, je trouve bizarre de calculer une moyenne au moyen d'un type entier (la variable "moyenne" est de type int64_t)...