Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Vos tutoriels et astuces


Index du Forum » Vos tutoriels et astuces » Se passer des opérateurs logiques
Positon Hors ligne Rédacteur Points: 2396 Défis: 57 Message

Se passer des opérateurs logiques

Posté le 25/04/2014 16:57

Bonjour à tous, je me suis rendu compte que l'on pouvait se passer de And, Or, Not et Xor... en les remplaçant par des signes arithmétiques !
Cela se fait tout simplement grâce aux conditions booléennes. Pour ceux qui ne le savent pas, une condition est considérée comme étant un nombre, et vaut 1 si elle est vraie et 0 si elle est fausse.

Ainsi, si l'on considère deux conditions A et B :
A Or B
A And B
A Xor B
Not A
équivalent respectivement à :
A+B
A*B
A-B
1-A


Et quel serait l'intérêt d'utiliser cette méthode alors ? Et bien c'est plus rapide : j'ai fais quelques tests imprécis à l'arrache et les opérateurs arithmétiques sont environ 33% plus rapide. Je pense que je vais en faire d'autres pour préciser ces chiffres.

En revanche il y a des défauts. Outre le fait que ça nuit à la compréhension du code, cette méthode est en effet plus volumineuse en terme de taille, et ce à cause des parenthèse. Ces dernières sont indispensables, regardez l'exemple suivant par exemple :
(A=1) + (C>3)

En revanche, les conditions avec Not n'en requièrent pas, ce qui ne donne non pas une perte mais un gain de place :
Not A + Not B


Conclusion :
Remplacer des opérateurs logiques par des opérateurs arithmétiques ne sert à rien si vous voulez réduire la taille de votre programme. En revanche, ils peuvent vous permettre d'accélérer ce dernier en réduisant le temps d'exécution de certaines boucles (notamment les petites, puisque la condition y est vérifiée plus fréquemment). Pour finir, cette méthode peut constituer une astuce d'optimisation systématique avec les conditions qui n'utilisent pas de =,≠,<,>,≤ ou ≥, car elle confère un gain de place et de temps.

Bref, l'idée est à creuser. Quoi qu'il en soit, n'oubliez pas que ça reste de la micro-optimisation


Lephenixnoir Hors ligne Administrateur Points: 24337 Défis: 170 Message

Citer : Posté le 26/04/2014 09:24 | #


Oui, d'autant plus que certaines fonctions sont codées sur 2 octets dans le fichier programme, donc elles sont plus longues à interpréter (enfin, disons surtout que les gérer oblige un ralentissement de la boucle principale).
Et puis, je crois que cet interpréteur nous réserve encore quelques suprises.

Personne n'en a refait un, plus complet (à part PRGM2, qui est différent) ?
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Drac0300 Hors ligne Membre Points: 839 Défis: 39 Message

Citer : Posté le 26/04/2014 10:56 | #


A ma connaissance, personne n'a refait d'interpréteur mais sinon, tu peux toujours te tourner vers le lua qui est une bonne alternative.
PRGM2 n'est pas un interpréteur, il utilise celui de casio et vérifie juste les variables .
Dans Z/1Z, 42==666
Coïncidence ? Je ne pense pas.
Lephenixnoir Hors ligne Administrateur Points: 24337 Défis: 170 Message

Citer : Posté le 26/04/2014 11:49 | #


Drac0300 a écrit :
[...] sinon, tu peux toujours te tourner vers le lua qui est une bonne alternative.

Oh, mais je ne cherche pas une alternative au Basic, il y a longtemps que je l'ai trouvée.

Je me demandais simplement si c'était faisable et/ou efficace de faire notre propre interpréteur.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Positon Hors ligne Rédacteur Points: 2396 Défis: 57 Message

Citer : Posté le 26/04/2014 12:00 | #


Ce ne serait pas intéressant, puisque la raison de programmer en basic, c'est de faire des jeux accessibles à tous. Si on cherche à développer nous-mêmes un interpréteur, on tend à restreindre cette accessibilité.
Drac0300 Hors ligne Membre Points: 839 Défis: 39 Message

Citer : Posté le 26/04/2014 12:14 | #


Mais si on faisait un interpréteur plus optimisé mais qui lit du basic casio, les fichiers de notre interpréteur seraient aussi lisible avec celui de casio. Il serait seulement plus rapide.
Mais je ne pense pas que ça en vaudrait la peine pour la vitesse que ça apporterait.

Dans Z/1Z, 42==666
Coïncidence ? Je ne pense pas.
Lephenixnoir Hors ligne Administrateur Points: 24337 Défis: 170 Message

Citer : Posté le 26/04/2014 12:16 | #


Ça dépend si les programmeurs Basic travaillent surtout sur des 75/85/95(SD) ou sur des 35+.

Positon a écrit :
[...] la raison de programmer en basic, c'est de faire des jeux accessibles à tous.

Là je ne suis pas d'accord. Je pense qu'il y a bon nombre de programmeurs qui programment en Basic parce qu'ils ne savent pas qu'il est possible de programmer en Lua/C/C++, ou ne savent pas le faire.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Drac0300 Hors ligne Membre Points: 839 Défis: 39 Message

Citer : Posté le 26/04/2014 12:17 | #


Par contre on commence à être clairement hors-sujet

Ajouté le 26/04/2014 à 12:20 :
@lephenixnoir mais s'ils ne connaissent pas la possibilité de programmer en lua par exemple, pourquoi connaîtraient-ils la possibilité d'utiliser notre interpréteur ?
Dans Z/1Z, 42==666
Coïncidence ? Je ne pense pas.
Lephenixnoir Hors ligne Administrateur Points: 24337 Défis: 170 Message

Citer : Posté le 26/04/2014 12:26 | #


Très juste.
C'est une histoire de publicité, et il faudrait le faire connaître de la même manière que -florian66- fait connaître le Lua.
Après, s'ils programment déjà en Basic, ils pourront être tentés par ce genre de programmes plus que par d'autres langages à apprendre, tels que le Lua/C/C++.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Alex_1186 Hors ligne Membre Points: 1215 Défis: 46 Message

Citer : Posté le 26/04/2014 21:29 | #


Je pense que ce n'est pas une mauvaise idée de se lancer dans le développement de notre propre interpréteur Basic... Pas pour tout de suite parce qu'il ne doit pas être fait "à l'arrache", et parce qu'il faut d'abord faire des études de marché pour vérifier sa viabilité (PRGM 2 n'a eu absolument aucune application à ma connaissance...).

Après l'intérêt c'est aussi qu'il rajoute plein de fonctionnalités...
Par exemple, la possibilité de compiler le code, pour le rendre supra-rapide! Je suis sûr qu'on peut trouver des méga-optimisations de partout (ex: quand il y a une séquence de F-line, au lieu de les afficher une par une comme un idiot, on lit toute la séquence et on affiche tout d'un coup!).

Mais je suis d'accord, le projet ne serait viable que s'il permettait de lire aussi les programmes Basic "classique" et inversement l'interpréteur classique pourrait lire les nouveaux programmes... (bien que ce dernier point ne soit peut-être pas nécessaire après tout...)

En tout cas (même si c'est HS désolé... ) je pense que c'est une bonne idée et qu'il faudrait éventuellement y réfléchir!
Projets que je soutiens
Projets que je soutiens
Robscape 2 de Ray
Les tests vidéo de Marmotti
Mes projets
Mes projets
Une dizaine de projets top secrets...

Timeless Remix Airwolf
"And the dream will never die..."
Lephenixnoir Hors ligne Administrateur Points: 24337 Défis: 170 Message

Citer : Posté le 26/04/2014 21:53 | #


Allez, dernier message avant la fermeture du HS.
Cet interpréteur serait bien évidemment capable de lire les programmes Basic classiques et inversement. C'est le même programme, juste plus optimisé.
Et cette puissance viendra bien entendu d'une compilation du code avant l'exécution. On verra pour la suite.

J'ai pas mal de boulot, mais si j'arrive à me libérer je serais enchanté de me mettre sur ce travail si le projet voit le jour.

Quoi qu'il en soit.
[/HS]
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Alex_1186 Hors ligne Membre Points: 1215 Défis: 46 Message

Citer : Posté le 27/04/2014 11:13 | #


Oui donc bref!
A propos des opérateurs logiques, moi ça m'avait surtout servi quand j'avais refait un jeu sur Graph 25+, qui n'a pas les opérateurs And, Or, Not...
Donc les techniques avec des + et des x m'avaient bien servi!

Au passage, les notations "officielles", en tout cas celles que j'ai vu en SI en première, sont bien choisies!
+ pour "ou", . pour "et", on retrouve les propriétés arithmétiques!

Pour en revenir au fait que ça ne marche pas toujours quand il y a des cas genre (1+ -1)= 0 alors que 1 And -1 = 1,
c'est seulement qu'on utilise des entiers pour des booléens!
Certes le Basic Casio mélange un peu les deux, mais il renvoie 1 ou 0!
Vous imaginez le typage avec ce qu'on fait?! (c'est presque du lambda-calcul...)
Bon, ça ne me pose aucun problème bien sûr! Mais il faudrait juste qu'on se limite à des opérations arithmétiques sur des "booléens", càd des entiers 0 ou 1.
(c'est-à-dire dans le domaines de définition des opérations logiques!)

Ajouté le 27/04/2014 à 11:23 :
Ah oui: le "-" pour le "Xor" est dangereux, puisqu'il sort du domaine de définition {0,1}!
Par contre il est plus efficace que le Xor de la calculette qui fait vraisemblablement, pour A Xor B:
A And Not B Or B And Not A
ce qui multiplie les conditions!

(elle ne peut pas faire A-B ou encore A≠B, car si les conditions sont des entiers quelconques ça foire...)

Donc là je pense qu'on peut optimiser en utilisant le "-" à bon escient!
Projets que je soutiens
Projets que je soutiens
Robscape 2 de Ray
Les tests vidéo de Marmotti
Mes projets
Mes projets
Une dizaine de projets top secrets...

Timeless Remix Airwolf
"And the dream will never die..."
Positon Hors ligne Rédacteur Points: 2396 Défis: 57 Message

Citer : Posté le 27/04/2014 16:17 | #


Ah merci, ça c'est intéressant
Je vais refaire des tests de rapidité pour voir ce que vaut "-" par rapport à Xor (jusque là je m'étais contenté du And).
Sinon, je savais pour les booléens, mais il faut savoir que cette méthode est utile uniquement avec les instructions conditionnelles.

Si le Xor est plus rapide ça pourrait être intéressant, dommage qu'il soit si peu utilisé :/
Alex_1186 Hors ligne Membre Points: 1215 Défis: 46 Message

Citer : Posté le 29/04/2014 19:07 | #


Positon a écrit :
Ah merci, ça c'est intéressant
Quoi parce que ce que je disais avant ça l'était pas?

Sérieusement:
Positon a écrit :
Si le Xor est plus rapide...
Au contraire j'ai dit que le Xor était sûrement plus lent que le "-"! Enfin je pense, mais j'attends tes tests avec impatience!
Projets que je soutiens
Projets que je soutiens
Robscape 2 de Ray
Les tests vidéo de Marmotti
Mes projets
Mes projets
Une dizaine de projets top secrets...

Timeless Remix Airwolf
"And the dream will never die..."
Btl Hors ligne Ancien modérateur Points: 3879 Défis: 107 Message

Citer : Posté le 29/04/2014 19:35 | #


A Positon, je me rappelle qu'il y a pas si longtemps, je voulais comparer des booléens... et la je me suis rendu compte que l'opérateur logique le plus approprié était un Xor! J'étais tellement heureux de l'utiliser.
Un excellent tuto video qui vous explique comment transférer des fichiers de l'ordinateur vers la calculatrice et vice versa ma chaine youtube
mes jeux
mes jeux

Jouez à 6 sur une seule calto : Curve Fever
Un die and retry qui vous fera bieeeen rager Test Andropov
un très bon sokoban
le seul vrai jeu de foot en basic : FIFA 12
Ca c'est ce que j'appelle un jeu de reflexion jewel master
Qui vaincra l'intelligence artificielle de cet othello
Le célèbre pacman
Et tant d'autres BTL's games

Le jeu du mois de Novembre et award du jeu le plus dur de l'année 2013 MultiTask, testez-le
Positon Hors ligne Rédacteur Points: 2396 Défis: 57 Message

Citer : Posté le 29/04/2014 21:12 | #


@Alex_1186 : Pourquoi tu demandes ça ? J'ai juste dit "ça c'est intéressant", c'est pas comme si j'avais dit "au moins ça c'est intéressant"

Et sinon oui, je me suis trompé. En disant "Xor" je pensais au Xor arithmétique, donc au "-".

@Btl : Ah la la, c'est toujours une joie de réussir à utiliser une fonction useless
En ce qui me concerne je me suis servi une fois dans ma vie de la fonction de saut de Dsz
Hydrielax Hors ligne Membre Points: 191 Défis: 3 Message

Citer : Posté le 08/07/2016 16:30 | #


En fait quand on écrit A Or B, c'est sous-entendu (A≠0) Or (B≠0).
Et si Or peut être remplacé par + (et And par *), alors on est tentés d'écrire A+B alors qu'il faut écrire (A≠0)+(B≠0), car on n'utilise plus les opérateurs logiques ! On retrouve bien alors les bons résultats !
Voilà pourquoi cette méthode est souvent moins économe...
Vous vous ennuyez ?
Téléchargez au plus vite Snake-Maker et Piano Tiles !

Lephenixnoir Hors ligne Administrateur Points: 24337 Défis: 170 Message

Citer : Posté le 08/07/2016 16:33 | #


Pendant qu'on parle, je précise que la condition « (a != 0) || (b != 0) » s'optimise en « (a | b) != 0 », ce qui permet de gagner un cycle supplémentaire.

Cela dit, la méthode « a + b » fonctionne bien tant qu'on travaille sur N, ce qui est souvent le cas.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Ne0tux Hors ligne Membre d'honneur Points: 3524 Défis: 265 Message

Citer : Posté le 09/07/2016 01:01 | #


Je rebondis sur ce topic pour dire qu'en effet les opérateurs +, - et * sont plus rapides, mais sont aussi probablement prioritaires sur les opérateurs logiques classiques.

J'ai aujourd'hui un collègue qui a résolu un bug gênant pour le client, qui était justement causé par le fait que le "+" est prioritaire sur le "OR", bien qu'ils fassent la même chose, en langage ST.

En réalité, tout langage définit une priorité des opérateurs, ce n'est pas inintéressant de le garder en tête.
Mes principaux jeux : Ice Slider - CloneLab - Arkenstone

La Planète Casio est accueillante : n'hésite pas à t'inscrire pour laisser un message ou partager tes créations !

LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 45 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd