CALCUL DE NOMBRES COMPLEXES, À L'AIDE D'UNE STRUCTURE SIMPLE, SURCHARGE DES OPÉR

cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 - 19 mars 2007 à 19:12
pifou25 Messages postés 144 Date d'inscription lundi 13 octobre 2003 Statut Membre Dernière intervention 21 décembre 2014 - 3 avril 2007 à 12:07
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/41897-calcul-de-nombres-complexes-a-l-aide-d-une-structure-simple-surcharge-des-operateurs-courants-et-conversions-implicites

pifou25 Messages postés 144 Date d'inscription lundi 13 octobre 2003 Statut Membre Dernière intervention 21 décembre 2014
3 avril 2007 à 12:07
De ce que j'ai compris, ils sont inutiles pour l'arithmétique parce qu'il n'existe pas d'interface Iarithmetic, (ou bien Iaddable + Isubstract + Imultipl + Idivise) et surtout on ne peut pas implémenter de tel interface car on ne peut pas ajouter les opérateurs dans les interfaces, aussi bien en VB que C#. Alors que apparement on peut le faire en C++, je devrais creuser la question mais je connais pas du tout C++.
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
3 avril 2007 à 08:36
Autant pour moi donc, mais je vais continuer à suivre l'affaire, car je suis déjà persuadé que les génériques ne sont pas aussi inutiles que ça (j'ai déjà utilisé un comparateur universel assez pratique pour trier facilement sur plusieurs clés n'importe quel tableau ou liste, ou bien pour sérialiser/désérialiser en une ligne de code n'importe quelle structure de données sérialisable), mais j'avoue que je n'ai pas bien saisi pourquoi certains pensent que les génériques sont inutiles pour l'arithmétique.
pifou25 Messages postés 144 Date d'inscription lundi 13 octobre 2003 Statut Membre Dernière intervention 21 décembre 2014
2 avril 2007 à 16:25
Après de longues recherches sur les génériques j'ai (enfin!) compris leur intérêt: exemple de déclaration:
Public Structure Complexe(of monType)
ensuite dans toute la classe je remplace Int32 par monType (!) ainsi je déclare les nombres complexes comme une partie réelel et une partie imaginaire en type générique (qui pourrait être Int32 comme ici, ou long ou double ou bien même une classe BigNum... de précision infinie... on peut rêver)
Sauf que, comme je viens de l'apprendre ici ( http://www.osnews.com/story.php/7930/The-Problem-with-.NET-Generics ) on ne peut pas implémenter d'interface iarithmetic en VB.NET (ni non plus C# apparement) ce qui nous interdit toute opération entre 2 variables déclarées as monType. on pourra au mieux utiliser une interface de comparaison (aucun intérêt pour les complexes). Et ça n'est d'aucune utilité par rapport à la surcharge des opérateurs entre un complexe et un numérique autre (int long double etc).
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
21 mars 2007 à 16:46
C'est indiqué ici :
http://fr.wikipedia.org/wiki/Nombre_complexe
Les nombres complexes ne peuvent pas avoir d'ordre.

Regarde d'abord à quoi servent les nombres complexes pour savoir ce qu'il est utile d'implémenter, à mon avis l'opérateur ^ ne sert pas à grand chose. Cependant, j'ai programmé les puissances 2, 3, 4 et 5 ici pour les images fractales :
http://patrice.dargenton.free.fr/fractal/FractalisSrc.html#228

Si tu utilises les génériques du DotNet2, normalement tu ne devrais pas avoir besoin de faire des surcharges pour chaque type (c'est justement l'intérêt de la chose).
pifou25 Messages postés 144 Date d'inscription lundi 13 octobre 2003 Statut Membre Dernière intervention 21 décembre 2014
21 mars 2007 à 15:59
MadMatt > en effet tu a raison sur ce point. (je laisserais quand meme à titre d'exemple de programmation les comparaisons mais j'ajouterais en commentaire que c'est pas valide mathématiquement)

Je viens juste de réaliser un truc: pour que mes opérateurs soient valables dans tous les cas, je dois encore plus les surcharger, genre A as Complexe + B as Long, A as Complexe + B as Double... et pour la commutativité ajouter aussi A as Long + B as Complexe ... etc si je veux prendre en compte tous les types et ceci pour toutes les opérations ça va nous faire un paquet de surcharges!!

Autre question: quelqu'un sait comment qu'on éleve un complexe à une puissance? pour implémenter l'opérateur ^ ! il y a forcément une méthode mais je ne sais plus laquelle...

Je ferais bientot une mise à jour avec une nouvelle classe pour les BigInt!
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
20 mars 2007 à 13:38
Pifou > Ben oui, un nombre complexe est un couple de 2 réels : (a,b). Comment tu compare (1,4) et (3,2) par exemple ?
pifou25 Messages postés 144 Date d'inscription lundi 13 octobre 2003 Statut Membre Dernière intervention 21 décembre 2014
20 mars 2007 à 11:39
Ha! j'en apprend une bonne, ainsi on ne peut pas valider mathématiquement ma pseudo-comparaison des complexes... domage! Je vais laisser tomber pour l'interface IComparable alors en attendant qu'un matheux définisse un jour une relation de comparaison ^^

Par contre Patrice, j'ai bien l'intention de faire une classe BigNum des chiffres à précision infinie, et ensuite il sera tout simple d'utiliser pour nos complexes cette structure BigNum.
J'ai trouvé des algo de calcul matriciel sur CS, alors pourquoi pas aussi des calculs de matrices en complexes?
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 159
20 mars 2007 à 10:26
Intéressant, Pour les membres accessibles par les utilisateurs (propriétés et méthodes), utilise ''' (3') pour la doc, cela permettra de connaitre des infos par des infos bulles (comme pour le reste du framwork).

En .NET2, c'est mis dans l'EDI, en .NET1, il te faut VBCommenter.
cs_Patrice99 Messages postés 1221 Date d'inscription jeudi 23 août 2001 Statut Membre Dernière intervention 9 septembre 2018
20 mars 2007 à 08:34
Super ! si tu arrives à implémenter IComparable, cela servira par exemple à faire des tris via un comparateur universel multi-clé (qui existe déjà). Ce qui serait bien aussi, c'est une classe en précision infinie : dans le constructeur, on indique simplement la précision souhaitée (pratique pour le calcul haute précision, par exemple un zoom infini sur les images fractales).
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
19 mars 2007 à 21:28
Oui c'est très interessant, la surcharge des opérateurs à l'air beaucoup plus simple en .Net qu'en VB6 (cf une source de Renfield ou EbArtSoft je crois)
Par contre l'espace complexe ne contient pas de relations de comparaisons : > ou <
cs_Willi Messages postés 2375 Date d'inscription jeudi 12 juillet 2001 Statut Modérateur Dernière intervention 15 décembre 2018 22
19 mars 2007 à 19:12
Excellente démonstration de la surchage d'opérateur et des conversions explicit de types !!!
Bonne continuaton ++
Rejoignez-nous