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 :

Division par 16 en C


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 5
    Par défaut Division par 16 en C
    Qui peut me dire ce qui est faux: je veux juste faire une division par 16

    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
     
    #include <stdio.h>
     
    int main()
    {
      float x;
      float a; 
      x = a/16;
     
      printf("entrer un nombre\n"); 
      scanf("%f\n",&a);
      x = a/16;
     
      printf("%f\n",x);
      return 0;
    }

  2. #2
    Rédacteur

    Avatar de Erwy
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2003
    Messages
    4 967
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 967
    Par défaut
    merci de poster dans le bon forum

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 29
    Par défaut
    Bah, je pense que ça lui plait pas parce que tu divise pas par un flot...
    Si tu mets 16.00, je pense que ça devrait fonctionner.

  4. #4
    Membre habitué
    Inscrit en
    Janvier 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 9
    Par défaut
    Heu le probleme c'est surtout que tu utilises la variable "a" avant de la definir (avant le scanf). Et un conseil, n'utilises plus scanf ou tu te feras engueuler par certaines personnes du forums
    Biou Pink Powa

  5. #5
    Expert éminent
    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
    Par défaut
    Citation Envoyé par Biou Pink Powa
    Heu le probleme c'est surtout que tu utilises la variable "a" avant de la definir (avant le scanf). Et un conseil, n'utilises plus scanf ou tu te feras engueuler par certaines personnes du forums
    Biou Pink Powa
    'Eng*euler' n'est pas le mot. On préfère rappeler qu'une saisie de ligne 'humaine' se fait par fgets(). On peut ensuite faire le traitement qu'on veut avec la chaine saisie (sscanf(), strtod() etc.). Le 'f' de scanf() signifie 'formatted'. Les humains 'formattés', j'en connais pas et je pense que je n'aimerais pas trop ça...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 10
    Par défaut
    Les humains 'formattés'
    heu...
    Comparer les machine au humain, c'est comme pour scanf() faut éviter parceque ca fait pas un beau mélange!
    Enfin pour l'instant!

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Salut

    Qu'elle est l'erreur exactement, car le fait que tu écrives
    float x;
    float a;
    x = a/16;
    n'a aucune importance, ça ne sert à rien, mais ça ne doit pas faire planter (enfin, je pense).

    Pour ce qui est du scanf, celà dépend du contexte, pour des petits programmes d'essais, OK pas de problèmes, pour de la production (vendue dans le commerce par exemple), hors de question.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  8. #8
    Expert éminent
    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
    Par défaut
    Citation Envoyé par Trap D
    Qu'elle est l'erreur exactement, car le fait que tu écrives
    float x;
    float a;
    x = a/16;
    n'a aucune importance, ça ne sert à rien, mais ça ne doit pas faire planter (enfin, je pense).
    Si, ça a de l'importance. C'est un UB, et il peut arriver n'importe quoi.

    ('a' n'est pas initialisé, et c'est un flottant. Pourquoi pas un NaN...)

    Une variable non initialisée autre que char peut avoir une valeur correspondant à une 'Trap Représentation' qui peut provoquer un exception système (Comme un Segmentation Fault etc.).

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    325
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Décembre 2002
    Messages : 325
    Par défaut
    Si, ça a de l'importance. C'est un UB, et il peut arriver n'importe quoi.

    ('a' n'est pas initialisé, et c'est un flottant. Pourquoi pas un NaN...)
    Tu peux preciser à quoi correspondent tes abréviations s'il te plait ?

  10. #10
    Membre éprouvé
    Inscrit en
    Novembre 2002
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 120
    Par défaut
    Si je me souviens bien,
    UB = Undefined Behavio[u]r
    NaN = Not a Number (le résultat d'une division par 0, par exemple).

  11. #11
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Oui c'est celà.
    Je me pose la question : comment, sans initialisation, a peut prendre une valeur faisant planter la machine, puisque je ne fais que la division de a par 4 ? Emmanuel, si tu nous écoutes
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  12. #12
    Membre éprouvé
    Inscrit en
    Novembre 2002
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 120
    Par défaut
    Encore une question à ajouter à cells de Trap D: qu'est-ce que NAN, vraiment? Il est défini tel que 1/0, mais quelle est la véritable valeur numérique de NAN? Comment le microprocesseur peut-il assigner NAN à un emplacement mémoire (comment fait-il pour éviter les "collisions" avec les valeurs 0..255 pour les octets, par exemple, i.e. pour éviter qu'on prenne NAN pour un nombre "normal")?

  13. #13
    Expert éminent

    Avatar de Anomaly
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 380
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ShootDX
    Encore une question à ajouter à cells de Trap D: qu'est-ce que NAN, vraiment? Il est défini tel que 1/0, mais quelle est la véritable valeur numérique de NAN? Comment le microprocesseur peut-il assigner NAN à un emplacement mémoire (comment fait-il pour éviter les "collisions" avec les valeurs 0..255 pour les octets, par exemple, i.e. pour éviter qu'on prenne NAN pour un nombre "normal")?
    NaN est une constante définie pour les flottants uniquement. Dans la représentation binaire des flottants, il existe une combinaison qui donne NaN.

  14. #14
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Ok, ce qui explique la plante à a/16.
    Connais-tu cette combinaison ? juste pour info, je peux dormir sans
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  15. #15
    Expert éminent

    Avatar de Anomaly
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 380
    Billets dans le blog
    1
    Par défaut
    Bonsoir,
    Pas de problèmes il suffit de trouver un peu de doc sur IEEE 754 (la norme de représentation des flottants)

    Un lien que je trouve clair : http://www.enseignement.polytechnique.fr/profs/informatique/Jean-Jacques.Levy/poly/main1/node7.html

  16. #16
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Finalement, comme polytechnique était injoignable, j'ai trouvé celà :
    Special Values
    IEEE reserves exponent field values of all 0s and all 1s to denote special values in the floating-point scheme.

    Zero
    As mentioned above, zero is not directly representable in the straight format, due to the assumption of a leading 1 (we'd need to specify a true zero mantissa to yield a value of zero). Zero is a special value denoted with an exponent field of zero and a fraction field of zero. Note that -0 and +0 are distinct values, though they both compare as equal.

    Denormalized
    If the exponent is all 0s, but the fraction is non-zero (else it would be interpreted as zero), then the value is a denormalized number, which does not have an assumed leading 1 before the binary point. Thus, this represents a number (-1)s x 0.f x 2-126, where s is the sign bit and f is the fraction. For double precision, denormalized numbers are of the form (-1)s x 0.f x 2-1022. From this you can interpret zero as a special type of denormalized number.

    Infinity
    The values +infinity and -infinity are denoted with an exponent of all 1s and a fraction of all 0s. The sign bit distinguishes between negative infinity and positive infinity. Being able to denote infinity as a specific value is useful because it allows operations to continue past overflow situations. Operations with infinite values are well defined in IEEE floating point.

    Not A Number
    The value NaN (Not a Number) is used to represent a value that does not represent a real number. NaN's are represented by a bit pattern with an exponent of all 1s and a non-zero fraction. There are two categories of NaN: QNaN (Quiet NaN) and SNaN (Signalling NaN).

    A QNaN is a NaN with the most significant fraction bit set. QNaN's propagate freely through most arithmetic operations. These values pop out of an operation when the result is not mathematically defined.

    An SNaN is a NaN with the most significant fraction bit clear. It is used to signal an exception when used in operations. SNaN's can be handy to assign to uninitialized variables to trap premature usage.

    Semantically, QNaN's denote indeterminate operations, while SNaN's denote invalid operations.
    Je dormirai moins sot ce soir
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  17. #17
    Expert éminent
    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
    Par défaut
    Citation Envoyé par Trap D
    Je me pose la question : comment, sans initialisation, a peut prendre une valeur faisant planter la machine, puisque je ne fais que la division de a par 4 ?
    La variable étant locale et non initialisée, sa valeur est indéterminée au démarrage. La combinaison de bits résultant pourrait très bien être interprétée comme une valeur invalide au moment de l'exécution de la division (ou tout autre opération, ou même une simple affectation, peu importe)... La norme du C parle de 'Trap Representation'. (Valeur 'piège')

    Exemple classique (théorique). Soit un processeur capable d'adresser 24 bits (68000, par exemple). On aurait très bien pu convenir qu'une adresse soit stockée dans un registre 32 bits, dont les bits de poids fort (24-31) aient une valeur particulière.

    1010 aaaa aaaa aaaa

    Si une valeur quelconque est chargée dans le registre d'adresse, par exemple :

    1101 xxxx xxxx xxxx

    le processeur décide alors de considérer cette adresse comme invalide (1101 <> 1010) et déclenche alors un trap (piège logiciel).

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 5
    Par défaut Division par 16 en C
    en remplacant la ligne de code
    scanf("%f\n",&a);
    par scanf("%f",&a); cela a marché
    Apparement \n etait de trop.
    Merci pour toutes les aides

  19. #19
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 135
    Par défaut Re: Division par 16 en C
    Citation Envoyé par hermannd
    en remplacant la ligne de code
    scanf("%f\n",&a);
    par scanf("%f",&a); cela a marché
    Apparement \n etait de trop.
    Merci pour toutes les aides
    c'est normal car scanf attend un \n pour valider ce que t'as tapé.. si t'en remets un probleme..

    par contre si tu tapes :
    scanf("%d/%d/%d", &a, &b, &c);
    et que tu saisis 15/12/56 alors la ca marchera
    a = 15
    b = 12
    c = 56

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Math][Info]division par zéro
    Par niko8181 dans le forum Général Java
    Réponses: 9
    Dernier message: 23/05/2005, 09h58
  2. Comment faire une division par 5 avec les decalages
    Par Zaion dans le forum Assembleur
    Réponses: 7
    Dernier message: 05/11/2004, 17h33
  3. [CR8.5] Problème de division par zéro sur formule
    Par franck.cvitrans dans le forum Formules
    Réponses: 3
    Dernier message: 10/06/2004, 13h41
  4. [LG]a divise par b
    Par backsync dans le forum Langage
    Réponses: 8
    Dernier message: 22/10/2003, 21h37
  5. probleme avec une division par zéro
    Par jcharleszoxi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/03/2003, 18h14

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