Division C [Résolu]
Répondre à la discussion
Affichage des résultats 1 à 7 sur 7

Division C [Résolu]



  1. #1
    Clfve

    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
    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;
    }

    -----
    Dernière modification par gienas ; 03/05/2024 à 20h41. Motif: Ajouté les balises code obligatoires pour les programmes

  2. #2
    umfred

    Re : Division C

    probablement des conversion int64 => uint64 => int64

  3. #3
    pm42

    Re : Division C

    Citation Envoyé par umfred Voir le message
    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

  4. #4
    Clfve

    Re : Division C

    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.

  5. A voir en vidéo sur Futura
  6. #5
    pm42

    Re : Division C

    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.

  7. #6
    Clfve

    Re : Division C

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

  8. #7
    Paraboloide_Hyperbolique

    Re : Division C

    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)...

Discussions similaires

  1. Division du front d'onde & Division d'amplitude
    Par Ikgn dans le forum Physique
    Réponses: 5
    Dernier message: 04/11/2022, 18h06
  2. Division
    Par invite47e6b64d dans le forum Mathématiques du supérieur
    Réponses: 4
    Dernier message: 09/05/2015, 20h31
  3. Division par 529
    Par invitebf8cb3eb dans le forum Électronique
    Réponses: 37
    Dernier message: 22/04/2008, 11h52
  4. division
    Par inviteac73760b dans le forum Mathématiques du collège et du lycée
    Réponses: 5
    Dernier message: 08/11/2007, 10h07
  5. division de l'ADN
    Par inviteb9e1596e dans le forum Biologie
    Réponses: 25
    Dernier message: 28/03/2007, 16h44