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


1, 2 Suivante
Eltoredo Hors ligne Modérateur Points: 4301 Défis: 35 Message

Citer : Posté le 25/04/2014 17:00 | #


Une optimisation remplacée par une autre (place par vitesse) Sinon joli tuto
La procrastination est une vertu. (voir ma description pour comprendre mon raisonnement)
Totoyo Hors ligne Membre d'honneur Points: 16102 Défis: 102 Message

Citer : Posté le 25/04/2014 17:04 | #


Tiens, je ne m'en servais pas car selon mes tests, c'était plus lent. Je vais les refaire, car ça m’intéresse si c'est effectivement plus rapide
Drac0300 Hors ligne Membre Points: 839 Défis: 39 Message

Citer : Posté le 25/04/2014 18:27 | #


Mais, juste une remarque : prenons
1->A
-1->B

Alors A Or B = 1
Et A+ B = 0
Non ?
Dans Z/1Z, 42==666
Coïncidence ? Je ne pense pas.
Eltoredo Hors ligne Modérateur Points: 4301 Défis: 35 Message

Citer : Posté le 25/04/2014 18:42 | #


Ce que tu as écrit n'est pas dans le code qu'il nous a fournit
La procrastination est une vertu. (voir ma description pour comprendre mon raisonnement)
Positon Hors ligne Rédacteur Points: 2396 Défis: 57 Message

Citer : Posté le 25/04/2014 18:48 | #


En fait ça ne marche que dans un sens, je m'explique :
Une condition vraie vaut 1
Une valeur autre que 0 (donc pas seulement 1) est une condition vraie

Or les opérateurs arithmétiques marchent bien uniquement lorsqu'on manipule des 1 et des 0, c'est-à-dire des conditions avec un signe (comme un =) ou un Not. Une simple variable utilisée comme condition peut être de n'importe quelle valeur.

Par ailleurs, j'ai refait des tests beaucoup plus précis : j'ai essayé des conditions dans une boucle de 10 000 itérations et je suis sur un temps de 0,0023 secondes...pour les deux :/ ! Du coup je vais voir ce que ça donne avec 100 000 itérations pour mieux voir s'il y a un écart.
Drac0300 Hors ligne Membre Points: 839 Défis: 39 Message

Citer : Posté le 25/04/2014 18:50 | #


Ce que je veux dire avec mon exemple c'est que l'opérateur Or ne peut pas toujours être remplacé par un + car, par exemple avec deux nombres opposés, il donnera 0 même si les deux nombres sont différents de 0.
Dans Z/1Z, 42==666
Coïncidence ? Je ne pense pas.
Positon Hors ligne Rédacteur Points: 2396 Défis: 57 Message

Citer : Posté le 25/04/2014 18:52 | #


Non, en effet
C'est vrai que je ferais mieux de le préciser, bien que cette astuce s'adresse à un public confirmé
Tenmatx Hors ligne Membre Points: 996 Défis: 2 Message

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


Moi je me sert de ça uniquement quand je veux faire des opérations.
Par exemple : X+(G=27)-(G=38→X
Mes programmes de maths
Mes programmes de maths

Toutes les formules de Première S.
Toutes les formules de Terminale S.
Un programme de calculs.
Mes meilleurs jeux
Mes meilleurs jeux

Jeu gagnant des 48h CPC n°12

Mon site de discussion pour ados : http://entre-ados.net/ (a brûlé dans l'incendie d'OVH)
Mon éditeur de cours en ligne et plateforme de partage : http://wordline.xyz (a succombé à la concurrence de Google Drive...)
Lephenixnoir Hors ligne Administrateur Points: 24579 Défis: 170 Message

Citer : Posté le 25/04/2014 20:07 | #


Le titre portait à confusion, je suis d'avis qu'il ne faut surtout pas se passer des opérateurs logiques, notamment et surtout en C où un grand travail d'optimisation s'impose à chaque fois, et où ces opérateurs ont une grande importance, avec les algorithmes.
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 25/04/2014 20:47 | #


Évidemment, mais là je parle uniquement du basic. Ce n'est pas en C qu'on aura besoin d'optimiser chaque condition
Lephenixnoir Hors ligne Administrateur Points: 24579 Défis: 170 Message

Citer : Posté le 25/04/2014 20:50 | #


Utiliser les opérateurs logiques reste une bonne habitude à prendre, du moins à mon avis, car ils permettent souvent d'éviter une déclinaison en liste de possibilités (donc de conditions), qui est autrement plus lourde en code.
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 25/04/2014 20:56 | #


Mais comme l'indique le tuto, le volume de code n'est pas le seul critère. En basic, la vitesse est également un élément crucial.
Utiliser les opérateurs logiques reste une bonne habitude à prendre

Alors après, c'est sûr que c'est une mauvaise idée pour un débutant de se perdre dans des optimisations compliquées. C'est comme, par exemple, celle qui consiste à écrire Not A à la place de A=0 : c'est peu intuitif et on ne s'en occupe pas lorsqu'on découvre la programmation, mais à plus haut niveau on s'en sert pour optimiser légèrement.
Lephenixnoir Hors ligne Administrateur Points: 24579 Défis: 170 Message

Citer : Posté le 25/04/2014 21:04 | #


En effet, ça fait longtemps que je n'ai plus travaillé en Basic.
Et je suppose qu'à force je ne suis plus un débutant ?
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 25/04/2014 22:49 | #


Dans le même style (je ne sais pas si c'est plus rapide mais ça permet d'éviter d'avoir à aller chercher dans les menus ) je crois que ≠ peut être remplacé par un - .
Dans Z/1Z, 42==666
Coïncidence ? Je ne pense pas.
Lephenixnoir Hors ligne Administrateur Points: 24579 Défis: 170 Message

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


En fait...
L'opérateur différent est exécuté en deux étapes: d'abord le processeur calcule la différence entre les deux nombres, et ensuite il constate si ce résultat est ou non nul.
L'opérateur moins n'implique que le calcul de la différence, mais pour savoir si la condition est validée, le processeur va chercher si elle est ou non nulle.
Du coup... il n'y a aucune différence, si la compilation est bien faite.

Au fait Positon, il y a un gros défaut à ta méthode, puisque les opérateurs logiques ne renvoient que des 0 et 1 alors que les opérateurs arithmétiques peuvent bien renvoyer 2 ou -1 en n'utilisant que des booléens, puisqu'ils ne les considèrent pas comme tels. Pour les conditions, c'est donc correct, mais pas dans les calculs.
Mon graphe (11 Avril): ((Rogue Life || HH2) ; PythonExtra ; serial gint ; Boson X ; passe gint 3 ; ...) || (shoutbox v5 ; v5)
Dark storm Hors ligne Labélisateur Points: 11641 Défis: 176 Message

Citer : Posté le 26/04/2014 07:06 | #


On commence à rentrer dans de l'optimisation binaire, mais le Basic est pas fait pour
Finir est souvent bien plus difficile que commencer. — Jack Beauregard
Positon Hors ligne Rédacteur Points: 2396 Défis: 57 Message

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


@Lephenixnoir : Ça n'a pas d'importance, puisque les instructions conditionnelles n'attendent pas un booléen mais simplement une valeur nulle pour une condition fausse et une valeur non nulle pour une condition vraie.

Ajouté le 26/04/2014 à 08:15 :
À moins que tu ne veuilles parler des calculs du type A+(B<3)->A ? Dans ce cas, oui, ça peut poser problème, mais c'est pas très grave.
Lephenixnoir Hors ligne Administrateur Points: 24579 Défis: 170 Message

Citer : Posté le 26/04/2014 08:20 | #


Oui, c'est bien ce que je disais.
Les calculs du genre
(I And 1) Xor (J And 1)->A

fonctionnent très bien en logique, mais plus en arithmétique.
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 09:20 | #


@lephenixnoir c'est comme ça en C mais il n'y a pas de compilation en basic (et on peut s'attendre a n'importe quoi avec la vitesse du basic Casio )
Dans Z/1Z, 42==666
Coïncidence ? Je ne pense pas.
Lephenixnoir Hors ligne Administrateur Points: 24579 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)
1, 2 Suivante

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 160 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