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

VB.NET Discussion :

Fonctions de calcul (réels)


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 19
    Par défaut Fonctions de calcul (réels)
    Bonjour à vous tous !

    Je cherche depuis pas mal de temps dans les différents sites de sources VB un ensemble de fonctions permettant d'effectuer des calculs "usuels" sur des chaines.

    Je m'explique, au lieu d'utiliser les types numériques (très limités pour des applications de math), on utiliserai le type string pour stocker un nombre et on lui ferai subir des opérations comme on les apprenait en CE1 (additions à retenues...). Cela permet de passer de la limite des quelques dizaines de digits des types numériques aux deux milliards de caractère inscriptibles dans une chaine. La seule limite de calcul en serait donc la puissance de l'ordinateur.

    Je cherche donc les 4 opérations élémentaires (addition, soustraction, multiplication et division) sous cette forme mais travaillant sur des chaines gérant le séparateur décimal (soit avec une mantisse soit avec le caractère directement dans le chaine) et les nombres négatifs.

    J'ai réussi à programmer une fonction qui additionne une chaine d'entier naturel de cette manière, elle additionne des nombres de plusieurs milliers de digits en moins d'une seconde : (Si vous ne voyez pas ce que je veux dire)
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
        Public Function Addition(ByVal pNombre1 As String, ByVal pNombre2 As String, Optional ByVal pArrondi As Boolean = True) As String
            ' Equilibrage & Déclarations
            pNombre1 = EquilibrerChiffres(pNombre1, pNombre2)
            pNombre2 = EquilibrerChiffres(pNombre2, pNombre1)
            Dim cResultat As String = "", cRetenue As Byte = 0
            Dim cTemp1 As Byte, cTemp2 As Byte, cTemp As Byte
            ' Balayage
            For i As Integer = pNombre1.Length To 1 Step -1
                ' Addition monodigitale
                cTemp1 = Mid(pNombre1, i, 1)
                cTemp2 = Mid(pNombre2, i, 1)
                cTemp = cTemp1 + cTemp2 + cRetenue
                cRetenue = 0
                ' Retenue
                If Len(cTemp.ToString) = 2 Then
                    cRetenue = Val(Mid(cTemp.ToString, 1, 1))
                    cTemp = Val(Mid(cTemp.ToString, 2, 1))
                End If
                cResultat = cTemp.ToString & cResultat ' Concaténation
            Next i
            If pArrondi Then ' Retourne l'écriture arrondie
                Return Val(cRetenue & cResultat).ToString
            Else ' Retourne l'équiture complète
                If cRetenue <> 0 Then
                    Return cRetenue & cResultat
                Else : Return cResultat
                End If
            End If
        End Function
     
        Public Function EquilibrerChiffres(ByVal pNombre1 As String, ByVal pNombre2 As String) As String
            If pNombre1.Length < pNombre2.Length Then
                Dim cZeros As String = ""
                For i As Integer = 1 To (pNombre2.Length - pNombre1.Length)
                    cZeros &= "0"
                Next
                Return cZeros & pNombre1
            Else : Return pNombre1
            End If
        End Function
    Est-ce que quelqu'un saurait où trouver ces 4 fonctions sur les nombres décimaux et négatifs ?

    J'ai déjà beaucoup fouillé le net, en vain.
    Merci beaucoup d'avance, Léo.

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    91
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 91
    Par défaut
    Désolé mais je n'ai jamais vu ce genre de fonction,
    en revanche j'ai eu la même idée que vous après avoir découvert une vidéo montrant comment on peut faire des multiplications de 3x3 digits avec 9 additions
    et un traitement sur les chaînes

    http://pagesperso-orange.fr/therese....lt_grecque.htm

    Je viens de découvrir ce site il montre comment faire le calcul

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 19
    Par défaut
    Merci anat1212 pour votre réponse,

    Je ne connaissez pas cette technique de multiplication (per gelosia) qui est très efficace, bien plus que celle des tracés linéaires (technique maya) et circulaire où l'on s'embrouille très vite.

    Je pense par contre, qu'il sera plus facile de trouver une fonction de calcul utilisant la méthode usuelle de multiplication plutôt que l'algorithme per gelosia, en occident du moins . Donc si l'un d'entre vous trouve, je suis toujours preneur !

    En fait, quand on y réfléchi les fonctions "avancées" en trigonométrie, analyse... reposent toutes sur une arithmétique classique (addition, soustraction, multiplication, division - on pourrait rajouter modulo -). On pourrait même dire que finalement la multiplication repose sur l'addition (ce qui simplifie sa programmation au détriment des performances). Alors que sont les types numériques, tout simplement des classes dont VB s'est dotées de méthodes d'opérations (addition, division, cosinus, exponentielle...) et dans certains cas d'une gestion de la virgule flottante.

    On peut donc en déduire que la limite owerflow de ces types vient de leur implémentation, il serait donc possible d'utiliser les chaines alphanumériques pour stocker les données numériques (suite de digits) en les structurant avec une variable numérique pour la significande (communément appelée mantisse) ou en stockant directement le séparateur décimal dans la chaine puisqu'elle est alphanumérique. Vous me suivez ?
    Alors l'idée de ces fonctions est d'utiliser les string comme types de stockage de nombres et ensuite de leur appliquer les méthodes usuelles d'opérations arithmétiques que l'on a appris dans notre tendre enfance. On pourra ensuite étendre aux fonctions plus spécifique en utilisant ces opérations élémentaire.
    Les avantages de cette méthode sont :
    - Pas de limite owerflow puisque la taille du nombre est déterminée par le temps de calcul et peut donc être théoriquement infini.
    - Le temps de calcul est linéaire et augmente proportionnellement à la longueur de la chaine (puisque les opérations reposent sur des opérations à un digit - table de multiplication, addition... -), ce qui, je crois, n'est pas le cas des fonctions déjà implémentées non ? (addition de VB).

    Merci pour votre attention et n'hésitez pas si vous avez des idées pour me mettre sur une piste ! Léo.

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 299
    Par défaut
    Tu as aussi les BigInt ou BigInteger, une recherche sur ce forum avec ces mots clefs te donnera quelques sujets contenant des infos mais aussi des liens vers les fans des grands nombres (voir aussi le forum algorithme)

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Avril 2009
    Messages
    19
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2009
    Messages : 19
    Par défaut
    Merci nikoko34, je vais me tourner de ce côté ou alors je programmerai moi même toutes ces fonctions (ça va prendre du temps).

    Juste une chose, pensez vous que pour effectuer une multiplication il est préférable (au niveau du temps de calcul, mon but est l'optimisation ultime) d'enchainer une suite d'addition ou alors de programmer une fonction qui reproduit le travail que l'on effectue lorsque l'on pose une multiplication (avec retenues et tout) ?

    Je veux dire, est-ce que pour faire a*b, j'appelle (b-1) fois l'addition de a+a ou alors je programme une fonction avec retenues indépendante de la fonction d'addition ?

    Merci pour vos réponses !
    Léo.

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

Discussions similaires

  1. Fonction de calcul (convertisseur)
    Par MeRc|LeSs dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 28/12/2005, 18h24
  2. inversion de fonction de calcul
    Par jarko dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 16/12/2005, 18h31
  3. Réponses: 6
    Dernier message: 22/11/2005, 17h08
  4. Modifier un champs texte avec une fonction PHP (calcul TVA)
    Par Stella2809 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 22/11/2005, 00h55
  5. fonction qui calcule la factorielle ?
    Par piff62 dans le forum C
    Réponses: 8
    Dernier message: 27/02/2005, 11h00

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