IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Probleme de dépassement sur des calculs d'entiers


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 22
    Points : 8
    Points
    8
    Par défaut Probleme de dépassement sur des calculs d'entiers
    Bonjour,

    Voilà mon petit soucis :

    J'ai programmé des algorithmes me permettant de faire des calculs matriciels tels que calcul de déterminant, d'inversion de matrice, etc, sur un système embarqué (Microcontrôleur 68332).
    Au départ, tous les éléments de mes matrices étaient déclarés en float, je me suis aperçu que je n'étais pas très précis. J'ai voulu tout passer en entier. Une fois les modifications faites, j'ai pu voir que lors de certains calculs (comme le déterminant), je dépassais la capacité maximale de mes entiers c'est-à-dire 4 octects.

    Comme je n'ai rien trouvé dans les tutoriels et dans la FAQ (vraiment désolé s'il existe quelque chose ), je voulais savoir s'il était possible de faire une multiplication deux deux entiers de 4 octects chacun, dont le résultat serait codé sur 2 autres entiers de 4 octects chacun ???

    Merci de vos réponses !

  2. #2
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Il y a les long et les long long.
    Voir ce lien pour les différentes tailles de variable:
    http://c.developpez.com/faq/c/?page=...S_taille_types

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Sébastien THEVOT
    Bonjour,
    je voulais savoir s'il était possible de faire une multiplication deux deux entiers de 4 octects chacun, dont le résultat serait codé sur 2 autres entiers de 4 octects chacun ???
    Si ton compilateur le supporte (C99), il y a les [unsigned ]long long qui font au moins 8 octets...

    Sinon, il y a des bibliothèques tierces comme BigNum...

    Grillaid !

  4. #4
    Futur Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Merci de vos réponses,

    Mon compilateur n'accepte pas les long long. Je vais essayer d'inclure la bibliothèque BigNum.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    Pour améliorer la précision par rapport aux float, essaye les double.

    Calcul de déterminant avec des entiers ? J'ai un petit doute, là.

    Même avec une librairie multi-précision, tu vas vite buter sur des problèmes... de précision : et les valeurs < 1 ?
    Si la librairie est bien faite, elles seront représentées par 2 nombres, numérateur + dénominateur, avec inflation de la taille des nombres utilisés, si on veut garder un précision suffisante.

    Avec, bien entendu, le problème corollaire de ce genre de calcul multi-précision : le temps de calcul n'a plus rien à voir avec celui obtenu avec les types de base.

    Au total, ça va donc vite devenir problèmatique sur un système embarqué, comme tu l'as précisé.

  6. #6
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Pour améliorer la précision par rapport aux float, essaye les double.
    Citation Envoyé par Sébastien THEVOT
    Au départ, tous les éléments de mes matrices étaient déclarés en float, je me suis aperçu que je n'étais pas très précis. J'ai voulu tout passer en entier.
    Calcul de déterminant avec des entiers ? J'ai un petit doute, là.
    Où est l'erreur ?

    Mon compilateur n'accepte pas les long long. Je vais essayer d'inclure la bibliothèque BigNum.
    Tu as GMP ou NTL aussi.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,
    Citation Envoyé par PRomu@ld
    Où est l'erreur ?
    Il faut des matrices avec des coefficients très bien choisis pour avoir un déterminant entier.
    Cela n'arrive pas si souvent.

  8. #8
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    En fait, si les coeficients de la matrice sont des entiers, le déterminant sera entier ...

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,
    Citation Envoyé par PRomu@ld
    En fait, si les coeficients de la matrice sont des entiers, le déterminant sera entier ...
    Oups, où avais-je la tête ?

  10. #10
    Futur Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Bonjour,

    A propos de la bibliothèque BigNum, je n'ai pas réussi à la récupérer je suis tombé sur différents sites qui la nomme mais je n'ai pas trouvé les sources!
    Quelqu'un connaît un moyen de l'obtenir ??

    Sinon pour être plus explicite, tout mon problème vient du fait que je n'ai que 10 ms pour effectuer une multitude d'opérations : j'ai un applicatif et un OS qui tourne ensemble et ils n'ont que 10 ms pour leurs différentes tâches, de plus le tout est géré par un 68332 !!! Donc je vous laisse imaginer le peu de marge que je peux avoir !

    Je voulais utiliser des entiers pour diminuer les temps de calcul de mon algorithme qui me sert à identifier les paramètres du moteur que je pilote.
    Sachant que les paramètres calculés sont : un Ke de l'ordre de 0,72 et une constante de temps de l'ordre de 0,02. Il me faut donc une précision assez élevée pour détecter les modifications de ces paramètres d'où l'idée de passer en entier....

  11. #11
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Si tu veux être rapide, oublie les bibliothèques de calcul en précision non bornée.

    Si tu veux manipuler des nombres avec virgules, utilise les doubles si les float ne sont pas assez précis. Si ce ne l'est toujours pas ou si tu es trop lent, là tes problèmes commence. Parce que je doute que tu trouves une bibliothèque toute faite qui te convienne et il va te falloir faire les choses à la main.

  12. #12
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    C'est un système avec moteur à asservir ?
    Si c'est le cas, je crois comprendre que tu utilises les matrices d'état pour ton modèle ?
    En quoi as-tu besoin de faire tous ces calculs ?
    Ton système doit faire quoi exactement ?

  13. #13
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 89
    Points : 91
    Points
    91
    Par défaut
    http://www.swox.com/gmp

    GMP is a free library for arbitrary precision arithmetic, operating on signed integers, rational numbers, and floating point numbers. There is no practical limit to the precision except the ones implied by the available memory in the machine GMP runs on.

  14. #14
    Futur Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par progfou
    C'est un système avec moteur à asservir ?
    Si c'est le cas, je crois comprendre que tu utilises les matrices d'état pour ton modèle ?
    En quoi as-tu besoin de faire tous ces calculs ?
    Ton système doit faire quoi exactement ?
    Pour te répondre c'est un système de commande d'ouverture et fermeture de porte de train.

    J'ai donc un moteur asservi en vitesse et en courant. Mon but est de voir l'évolution des paramètres moteur au cours du temps pour prédire d'éventuelles pannes sur le moteur. Le modèle du moteur a été mis sous forme d'un schéma bloc. J'utilise les algorithmes d'identification par la méthode des moindres carrés. Celle-ci fonctionne donc avec des matrices d'état du systèmes que je calcule à l'aide d'une mesure de la fem et de la vitesse angulaire du moteur.
    Voilà là je crois que j'ai tout dit !!

    Sinon pour l'utilisation des doubles c'est une piste que je vais étudier de suite, merci pour le coup de main.

  15. #15
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Je ne suis pas certain de bien comprendre pourquoi tu as besoin d'une grande précision (ciol: GMP, non mais le but n'est pas de calculer 1 million de décimales de PI non plus...) ?

    Comment est ta matrice d'états ?
    A quoi ressemble ton modèle (bien sûr, si tu as le droit de le montrer) ?
    Ceci dit, mes questions sortent du cadre du C...

  16. #16
    Futur Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Il n'y a pas seulement la précision qui m'importe mais surtout le temps de calcul.
    En passant en entier je ne veux pas perdre la précision que j'avais lorsque j'étais en float et j'espère gagner du temps de calcul !! Parce que 10 ms pour faire tourner l'applicatif et l'OS c'est un peu court, surtout que ce projet doit être porté sur une version précédente de notre platine de contrôle. Il a déjà fallut saucissonner ces algorithmes en plusieurs tâches pour que la platine (l'ancienne version) ne reset pas.

    D'ailleurs ça me fait penser à un autre problème !

    Est-ce-que le fait de partager mon algorithme en plusieurs tâches (1 seule tâche effectuée à chaque cycle de 10ms) peut avoir une incidence sur les résultats finaux (sachant qu'actuellement je fais tout à la suite) ????

    Par contre pour le modèle je vais avoir du mal à te le montrer, je ne crois pas que j'aurai l'autorisation de mon chef ! Désolé...

  17. #17
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Sébastien THEVOT
    Est-ce-que le fait de partager mon algorithme en plusieurs tâches (1 seule tâche effectuée à chaque cycle de 10ms) peut avoir une incidence sur les résultats finaux (sachant qu'actuellement je fais tout à la suite) ????
    Sur un système monoprocesseur, le multitâche n'apporte évidemment rien aux performances. Ce serait même plutôt le contraire, vu les temps de commutation qui ne sont pas négligeables.

  18. #18
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Sur un système monoprocesseur, le multitâche n'apporte évidemment rien aux performances. Ce serait même plutôt le contraire, vu les temps de commutation qui ne sont pas négligeables.
    Sauf si les tâches passent une grande partie de leur temps en attente.

  19. #19
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    J'ai survolé les caractéristiques de ce µC.
    C'est assez intéressant .
    Je suppose que le compilateur que tu utilises est fourni par le constructeur ?
    Le code est optimal à la génération ?
    10ms, c'est un temps, mais en terme de cycles, ça représente quoi ?
    Il tourne à quelle fréquence le tien ?
    Et puis, en vrac, tu as de la RAM externe ?
    Utilises-tu toute la local ram disponible (désolé si ça parait bizarre pour les termes, mais je ne le connais que depuis 30 minutes, alors bon ) ?

  20. #20
    Futur Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Les 10 ms correspondent au temps donné à l'appli et à l'OS pour effectuer toute leurs tâches (environ 6ms pour l'OS et 4 ms pour l'appli), on a un séquenceur de "tâches fait maison", les tâches sont créées et mises dans une liste d'attente avec un système de priorité qui permet de déterminer quelle tâche doit être effectuée en première, après l'initialisation de la platine à la mise sous tension on appelle les tâches de fond toutes les 10 ms, on a un "chien de garde" qui vérifie que le temps alloué pour l'OS et l'appli n'est pas dépassé par les tâches effectuées.
    Mon partage des tâches correspondrait plutôt au fait qu'après avoir lancer la première tâche pendant un cycle de 10 ms, j'attends le cycle suivant pour lancer la deuxième tâche etc...

    Je ne sais pas si c'est très clair !

    Autrement on fait tourner le 68332 à 25 MHz, on a ajouté de l'E2PROM et de la mémoire flash.

Discussions similaires

  1. Probleme d'aide sur des composants
    Par altaruk dans le forum Débuter
    Réponses: 0
    Dernier message: 01/07/2010, 12h59
  2. Probleme de syntaxe avec des calculs integrant des variables
    Par trigger00 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 30/06/2009, 10h20
  3. Caml win/ opérations sur des séquences d'entiers
    Par Sophie_26 dans le forum Caml
    Réponses: 29
    Dernier message: 02/05/2007, 21h25
  4. probleme de requetes sur des tables volumineuses
    Par abdoracle dans le forum Oracle
    Réponses: 6
    Dernier message: 14/06/2006, 16h41
  5. probleme d'heritage sur des chaines de caracteres
    Par pikiwiki dans le forum C++
    Réponses: 3
    Dernier message: 24/05/2006, 22h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo