| Transitivité des opérations | |
|
|
Auteur | Message |
---|
jjn4
Nombre de messages : 2747 Date d'inscription : 13/09/2009
| Sujet: Transitivité des opérations Mer 6 Avr 2011 - 23:18 | |
| Essayez cela : - Code:
-
print 4/22*100 print 4*100/22 Le premier donne : 0.00181818181818182 et le second donne: 18.18181818182 Dites-moi : c'est moi qui suis très fatigué ou bien il y a un bug sur la dernière version ? (il s'agit de la 09.21i4) ??????????? | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Transitivité des opérations Mer 6 Avr 2011 - 23:45 | |
| Essaie ceci: - Code:
-
print (4/22)*100 print 4*100/22 !!!!!!!!!!!!!!!! Il y a manifestement un bug... | |
|
| |
Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Transitivité des opérations Mer 6 Avr 2011 - 23:54 | |
| C'est pour cette raison que j'utilise (de manière excessive peut être) les parenthèses... il n'y a pas d'ambiguïté. la lecture de gauche à droite ne marche pas de ce cas :
La multiplication est prioritaire par rapport à la division : print 4 / 22 * 100 revient à écrire : print 4 / (22 * 100)
| |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Transitivité des opérations Jeu 7 Avr 2011 - 0:18 | |
| A l'évidence, c'est le cas, mais cela ne correspond pas aux règles mathématiques. Multiplication et division doivent avoir la même priorité, et donc s'exécuter de gauche à droite, tout comme addition et soustraction. Car dans l'exemple 4/(22*100), cela revient à transformer la multiplication en division: 4/22/100. Cela devrait être modifié. | |
|
| |
Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Transitivité des opérations Jeu 7 Avr 2011 - 0:27 | |
| Je ne connais pas les ordres de priorité des opérateurs en delphi mais je suppose que cela doit être normalisé quelque soit le langage. En C cela donne : * , / , %(modulo), +, -, Mais il doit y avoir quand même un problème car si on se réfère à la liste ci-dessus, print 7 - 2 + 5 devrait donner 0 ce qui n'est pas le cas... Edit : perso, je trouve que les parenthèses offrent pas mal d'avantage : pas d'ambiguite et on gagne en lisibilité... [Parenthèse] Pour revenir à un vieux post : Je ne comprend pas qu'il faut faire a% = int(a%/2) (chose qui me parait redondant) et qu'à côté de ça on utilise pas les parenthèses. Pourquoi être rigoureux à l'extrême dans un cas et pas dans l'autre ?... [/Parenthèse] | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Transitivité des opérations Jeu 7 Avr 2011 - 1:30 | |
| En Delphi, il y a une longue liste des priorités des opérations. * et / ont la même priorité, et + et - également, mais la priorité de ces dernières est inférieure aux premières. Ceci donne: 2+3*5-4/2 se calcule comme (2+(3*5))-(4/2) et produit ainsi le résultat escompté, soit 15.
En Panoramic, dans le cas de a% = int(a%/2) le calcul se déroule de la manière suivante: a% = round(int(float(a%)/2.0)) si tu omets le int(): a% = 3 a% = a%/2 alors Panoramic calcule a% = round(3.0) : ' résultat: 3 a% = round(float(a%)/2.0) : résultat: 2 car float(a%)/2.0 donne 1.5, ce qui donne 2 en arrondissant. Il faut savoir (communication de Jack) que Panoramic ne CONNAIT PAS la représentation interne des entiers sur 32 bits, dans les calculs. Cette représentation eciste UNIQUEMENT pour le stockage final en mémoire, et c'est pour cela qu'un ROUND implicite est effectué chaque fois qu'on fait a%=...
Mais revenons à nos priorités des opérateurs: on devrait avoir les priorités suivantes: priorite(*) = priorité(/) > priorité(+) = priorité(-) Toute autre règle constitue une anomalie aux conventions normales de priorités des opérations en arithmétique, et devrait être documentée dans Panoramic, ce qui n'est pas le cas. Donc, soit il faut mettre à jour la doc, soit il faut corriger la priorité. | |
|
| |
Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Transitivité des opérations Jeu 7 Avr 2011 - 1:51 | |
| Je suis d'accord avec toi: la doc aurait besoin d'une petite mise à jour sur ce sujet. Quand au entier, je comprend très bien tes explications, mais au final, je ne comprend toujours pas pourquoi il existe le type entier en Panoramic puisqu'en interne c'est des floats... Il y a une subtilité qui m'echappe... | |
|
| |
Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Transitivité des opérations Jeu 7 Avr 2011 - 9:03 | |
| Je pense que les variables a% existent en Panoramic parce que cela est un élément important de tous les langages Basic, tout comme les variables $. Mais Jack a certainement jugé inutile de développer deux arithmétiques indépendantes, une pour flottants et une pour entiers.
J'aurais peut-être une suggestion à faire à Jack: on pourrait peut-être imaginer une directive du type #ROUND_TO INTEGER_OFF/ON qui instruirait le compilateur de tronquer/arrondir lors de la conversion de flottant en entier, avec #ROUND_TO_INTEGER_ON par défaut. On pourrait aussi imaginer un tout nouveau menu dans le compilateur qui serait "Propriétés", comme cela existe dans d'autres logiciels de ce genre, dans lequel on pourrait sélectionner des options du genre: Tronquer flottant vers entier Oui/Non défaut: Non Répertoire par défaut pour FILE_OPEN, FILE_LOAAD, ...: répertoire du *.EXE/répertoire du *.BAS Palette de couleurs par défaut etc | |
|
| |
Contenu sponsorisé
| Sujet: Re: Transitivité des opérations | |
| |
|
| |
| Transitivité des opérations | |
|