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

Algorithmes et structures de données Discussion :

Algorithme pour calcul en virgule flottante


Sujet :

Algorithmes et structures de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 196
    Points : 61
    Points
    61
    Par défaut Algorithme pour calcul en virgule flottante
    Bonjour à tous
    voila j'ai exo à faire mais je ne vois vraiment comment faire, pour moi ce cours est diificle a digérer
    exo
    Il existe une plus grande valeur v représentée en virgule
    flottante telle que x+ v = x, à cause des erreurs d’arrondi. Écrire un programme pour déterminer cette valeur pour x = 1, x = 2, x = 4. Généraliser pour x = 2n .

    Merci

  2. #2
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    x=1
    v=1
    n=0
    while x!=x+v:
        v=v/2.0
        n=n+1
    print n
     
    """Affiche 53 donc v=2^(-53)"""
    Et voilà !
    Mais la réponse dépend du langage utilisé du type de donnée utilisé etc.. etc...
    Ici c'est python 2.6 avec les float prédéfinis.
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    196
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 196
    Points : 61
    Points
    61
    Par défaut
    merci d'avoir répondu
    mais en fait je ne comprends meme pas l'enoncé
    un éclaircissement m'aiderait à comprendre

  4. #4
    Rédacteur
    Avatar de Zavonen
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 772
    Détails du profil
    Informations personnelles :
    Âge : 76
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 772
    Points : 1 913
    Points
    1 913
    Par défaut
    Au début tu prends v=1.
    A chaque passage dans la boucle tu divises par 2.
    La condition de sortie de boucle est x+v=x
    Donc tu sors quand v est assimilé à 0 en tant que flottant.
    Il te suffit de compter le nombre d'itérations faites pour voir quelle puissance inverse de 2 est considérer comme nulle (précision du système).
    Ce qu'on trouve est plus important que ce qu'on cherche.
    Maths de base pour les nuls (et les autres...)

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Dans les programmes, les nombres à virgule ne sont pas très précis.

    Imaginons par exemple que la précision des nombres flottants soit de 7 chiffres après la virgule. Que se passe-t-il lorsqu'on compare deux flottants différents mais dont les 7 premiers chiffres après la virgule sont identiques ?

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if (1.01 == 1.0) //FAUX
     ...
     
    if (1.0001 == 1.0) //FAUX
     ...
     
    if (1.000001 == 1.0) //FAUX
     ...
     
    if (1.00000001 == 1.0) //VRAI
     ...

    On obtient quelque chose d'un peu absurde : l'ordinateur considère que les nombres 1.00000001 et 1.0 sont identiques !

    Dans ton exercice, on te demande de calculer à partir de combien de chiffres après la virgule la comparaison de deux nombres va provoquer une erreur d'imprécision.

    Dans mon exemple (précision de 7 chiffres), l'ordinateur va considérer que
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (1.0 + 0.00000001 == 1.0) //VRAI
      ...

    Tu auras beau rajouter 0.00000001 autant de fois que tu veux, ça ne changera rien.

  6. #6
    Membre régulier Avatar de paragoge
    Profil pro
    Inscrit en
    Février 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 115
    Points : 71
    Points
    71
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    v=1
    n=0
    while x!=x+v:
        v=v/2.0
        n=n+1
    print n

    Je débute en C : pourriez-vous me dire comment on écrirait ces quelques lignes dans ce language?

  7. #7
    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 : 38
    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
    Je débute en C : pourriez-vous me dire comment on écrirait ces quelques lignes dans ce language?
    A la ponctuation près : quasiment pareil. Je pense que tu peux proposer quelque chose avant qu'on te donne la solution clée en main.

  8. #8
    Membre régulier Avatar de paragoge
    Profil pro
    Inscrit en
    Février 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 115
    Points : 71
    Points
    71
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
    int main(void) {
    float v;
    int  n, x; 
    n = 0;
    while (x != x + v)
        v = v / 2;
        n = n + 1;
    printf(n);
    }
    C'est complètement faux, ça ne marche pas... mais au moins la maison n'explose pas, c'est déjà ça de sauvé.

  9. #9
    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 : 38
    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
    Bon effectivement du débutes en C (à moins que tu ne le fasse exprès )

    Une petite correction de ce que tu as posté (pour que ça compile et que ça soit un peu plus clair), ensuite est-ce que ça fait exactement ce que tu veux, c'est à toi de voir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void) 
    {
        float v , x ; 
        int  n; 
     
        n = 0;
        v = 1.f ;
        x = 1.f ; 
     
        while (x != (x + v) )
        {
            v = v / 2.f ;
            n = n + 1 ;
        }
     
        printf("n = %d\n", n );
     
        return EXIT_SUCCESS ; 
    }
    PS: au passage, si tu débutes en algo/prog ne fais pas du C mais un langage qui t'interdit les choses tordues (pas un langage moins puissant, juste moins permissif : il faut passer du temps sur les algos, pas sur leur implémentations), un langage comme ada par ex (mais ça n'est qu'une option, je ne veux pas lancer de débat)

  10. #10
    Membre régulier Avatar de paragoge
    Profil pro
    Inscrit en
    Février 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 115
    Points : 71
    Points
    71
    Par défaut
    Merci. Je n'ai pas encore testé mais je voulais justement rebondir sur la question de l'algo. Je voudrais bien être orienté pour pouvoir simplement pour commencer orthographier proprement un algorithme et pas seulement faire des phrases totalement improvisées du genre (c'est un exo où il faut "écrire un algo qui convertit la partie fractionnelle d'un nombre de la base 10 vers la base 2. Vérifier que l'algo ne rentre pas dans une boucle infinie, même avec les nombres comme 0.3)

    Enregistrer 0. dans une variable
    enregistrer dans la variable r la partie fractionnelle d'un nombre
    initialiser une variable U vide pour la liste des éléments uniques

    répéter l'opération suivante :
    multiplier la partie fractionnelle r par 2
    si le résultat n'est pas inclu dans U alors
    le placer dans U
    si le résultat est >= 1, ajouter à la variable result 1
    sinon ajouter 0
    si le resultat est inclu dans U, interrompre l'opération et afficher le resultat.

    Le problème c'est que je n'ai aucune référence claire de départ pour formuler de manière correcte un algo. Merci pour des infos.

  11. #11
    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 : 38
    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 il n'y a de notation "normée" pour écrire un algo. L'idée derrière un algo ou un pseudo code est simple :

    - Il doit être simple à lire (suffisamment lisible sans être trop verbeux)
    - facile à implémenter (il faut donc découper les bout d'algo en plus petites unités)
    - adapté au problème (c'est là que l'écriture varie d'un algo à l'autre)

  12. #12
    Membre régulier Avatar de paragoge
    Profil pro
    Inscrit en
    Février 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 115
    Points : 71
    Points
    71
    Par défaut
    Je pensais qu'il y avait des conventions précises! Que penses-tu de ces cours algo.

  13. #13
    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 : 38
    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
    Je pensais qu'il y avait des conventions précises!
    Certainement pas. ça se saurait Il n'y a pas de notation universelle.

    Concernant le cours, c'est une intro comme une autre tu peux en trouver partout même ici :

    http://algo.developpez.com/cours/

    Encore qu'un livre puisse être aussi une bonne idée :

    http://algo.developpez.com/livres/

  14. #14
    Membre régulier Avatar de paragoge
    Profil pro
    Inscrit en
    Février 2008
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 115
    Points : 71
    Points
    71
    Par défaut
    J'ai noté le lien. Merci beaucoup.

Discussions similaires

  1. Algorithmes pour calculer la racine carrée
    Par TrexXx dans le forum Mathématiques
    Réponses: 17
    Dernier message: 20/01/2009, 16h28
  2. Choisir la précision pour calculs en nombres flottants
    Par ciol2.6.12 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 02/06/2008, 14h14
  3. algorithme pour calculer les fonctions trigo ?
    Par thomas0302 dans le forum Mathématiques
    Réponses: 3
    Dernier message: 24/12/2007, 22h44
  4. Recherche d'un algorithme pour calculer un Checksum
    Par noune40 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 23/11/2006, 10h46
  5. algorithme pour calcul de probabilité
    Par filsdugrand dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 14/12/2005, 14h11

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