begin process at 2013 05 23 03:13:45
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths

 > ENCADREMENTS ET APPROXIMATIONS

ENCADREMENTS ET APPROXIMATIONS


 Information sur la source

Note :
Aucune note
Catégorie :Maths Classé sous :encadrement, approximation, round, arrondir Niveau :Débutant Date de création :22/12/2005 Date de mise à jour :24/02/2006 17:06:39 Vu / téléchargé :10 887 / 236

Auteur : Julien39

Ecrire un message privé
Site perso
Commentaire sur cette source (13)
Ajouter un commentaire et/ou une note

 Description

Ce code donne plusieurs fonctions semblables à Round de VB6.
Plus précisément 4 fonctions sont disponibles:
-Une fonction équivalente à Round
-Une fonction donnant une valeur approchée par défaut
-Une fonction donnant une valeur approchée par exès
-Une fonction d'encadrement

Source

  • '----------------------REMARQUES PRELIMINAIRES---------------------
  • 'DANS TOUTES CES FONCTIONS
  • '- n représente le nombre que l'on veut approcher
  • '- e représente le nombre de chiffres après la virgule, la précision
  • '------Définition de la partie entière ( Int ou Fix )------
  • 'Quel que soit le réel x, il existe un unique p tel que
  • 'p<=x<p+1 cet entier est appelé partie entière
  • 'L'existence et l'unicité ne sont pas prouvées ici mais si un doute
  • 'persiste sur ces deux propriétés contactez moi sur le réseau codes source.
  • Public Function Roundinf(n As Double, e As Long) As Double
  • Roundinf = Fix((10 ^ e) * n) / (10 ^ e)
  • 'La fonction Roundinf renvoie une valeure toujours inférieure à n,
  • 'Ceci se démontre grâce à la définition de la partie entière donnée ci dessus
  • 'en effet, il est évident qu quel que soit x, fix(x*10^n)<x*10^n
  • 'On obtient ce qu'on veut prouver en divisant par 10^n
  • End Function
  • Public Function Roundsup(n As Double, e As Long) As Double
  • Roundsup = Roundinf(n, e) + (1 / (10 ^ e))
  • 'On montre de la même manière que la fonction Roundsup renvoi un
  • 'nombre toujours supérieur à celui qui est donné
  • End Function
  • Public Function Roundapp(n As Double, e As Long) As Double
  • 'Cette fonction est équivalente à la fonction Round sous VB6
  • If n = Fix(n) Then
  • Roundapp = n
  • Else
  • n = n + "0"
  • 'Evite les erreur de comparaison de 5 avec ""
  • ent = Fix(n)
  • Rang = Len(ent) + 2 + e
  • 'Rang nous donne le rang de la valeure située en e+1 position apres la virgule
  • valeure = Mid$(n, Rang, 1)
  • If valeure >= 5 Then
  • Roundapp = Roundsup(n, e)
  • Else: Roundapp = Roundinf(n, e)
  • End If
  • 'Conventions d'arrondissement identique à Round()
  • End If
  • End Function
  • Public Function Encadrement(n As Double, e As Long) As Double
  • Encadrement = Roundinf(n, e) + " < " + n + " < " + Roundsup(n, e)
  • End Function
'----------------------REMARQUES PRELIMINAIRES---------------------

'DANS TOUTES CES FONCTIONS

'- n représente le nombre que l'on veut approcher
'- e représente le nombre de chiffres après la virgule, la précision

'------Définition de la partie entière ( Int ou Fix )------
'Quel que soit le réel x, il existe un unique p tel que
'p<=x<p+1 cet entier est appelé partie entière

'L'existence et l'unicité ne sont pas prouvées ici mais si un doute
'persiste sur ces deux propriétés contactez moi sur le réseau codes source.



Public Function Roundinf(n As Double, e As Long) As Double

Roundinf = Fix((10 ^ e) * n) / (10 ^ e)


'La fonction Roundinf renvoie une valeure toujours inférieure à n,
'Ceci se démontre grâce à la définition de la partie entière donnée ci dessus
'en effet, il est évident qu quel que soit x, fix(x*10^n)<x*10^n
'On obtient ce qu'on veut prouver en divisant par 10^n

End Function



Public Function Roundsup(n As Double, e As Long) As Double

Roundsup = Roundinf(n, e) + (1 / (10 ^ e))

'On montre de la même manière que la fonction Roundsup renvoi un
'nombre toujours supérieur à celui qui est donné

End Function


Public Function Roundapp(n As Double, e As Long) As Double
'Cette fonction est équivalente à la fonction Round sous VB6

If n = Fix(n) Then
   Roundapp = n
Else


   n = n + "0"
   'Evite les erreur de comparaison de 5 avec ""

   ent = Fix(n)
   Rang = Len(ent) + 2 + e
   'Rang nous donne le rang de la valeure située en e+1 position apres la virgule

   valeure = Mid$(n, Rang, 1)

   If valeure >= 5 Then
      Roundapp = Roundsup(n, e)

   Else: Roundapp = Roundinf(n, e)

   End If
   'Conventions d'arrondissement identique à Round()

End If

End Function

Public Function Encadrement(n As Double, e As Long) As Double

Encadrement = Roundinf(n, e) + " < " + n + " < " + Roundsup(n, e)

End Function

 Conclusion

Bravo à Gobillot pour sa patience. et allez voir http://www.vbfrance.com/forum.v2.aspx?ID=671735&po st=ok

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

22 décembre 2005 22:30:14 :
Oubli d'une fonction
23 décembre 2005 09:10:03 :
Plusieurs corections suite aux 2 premiers commentaires
23 décembre 2005 09:23:01 :
Idem, correction de Roundapp en ajoutant un 0 apres la virgule
24 février 2006 17:06:40 :
variables

 Sources du même auteur

Source avec Zip GÉNÉRATEUR DE MOTS DE PASSE
Source avec Zip CARRÉ PAR MÉTHODE DE L'ABAQUE
Source avec Zip Source avec une capture ETUDE DE FONCTIONS ALÉATOIRES
Source avec Zip Source avec une capture FONCTION VRAIMENT ALÉATOIRE
Source avec Zip Source avec une capture MATHÉMATIQUES PÉDAGOGIQUES

 Sources de la même categorie

Source avec Zip Source avec une capture Source .NET (Dotnet) SIMULATEUR DE PROPAGATION DE FEU DE FORÊT (2D) par Spoonyx
NOMBRE PREMIER OU COMPOSÉ par apexinfo
Source avec Zip Source avec une capture Source .NET (Dotnet) COMBINAISONS, ARRANGEMENTS, PERMUTATIONS, ANAGRAMMES par Math_Ador
Source avec Zip Source avec une capture Source .NET (Dotnet) CRYPTAGE PAR TRANSLATION par ravorasolofo
Source avec Zip Source avec une capture Source .NET (Dotnet) RÉVISION DE LA LOI D'OHM par Micoute

 Sources en rapport avec celle ci

Source avec Zip Source .NET (Dotnet) [VB 2005] TRAÇAGE DE TOUTES COURBES VIA DEUX MÉTHODES par Kite37
Source avec Zip Source .NET (Dotnet) PROGRAMME DE DICHOTOMIE AVEC PRÉCISION DE 10^-30 SOIT 28 CHI... par fdiedler2000
Source avec Zip Source avec une capture Source .NET (Dotnet) CHRONOMÉTRE POUR ROUND DE BOXE par Dav76df
Source avec une capture VBA EXCEL : FONCTION ROUND POUR COMPATIBILITÉ EXCEL 97 par FENETRES
ARRONDIR UN NOMBRE A 2 CHIFFRES APRES LA VIRGULE par Nix

Commentaires et avis

Commentaire de jack le 23/12/2005 01:25:47 administrateur CS

Salut
Ca pourra peut-être servir ...
Tu aurais plutôt dû mettre ça dans la section maths.
Corrige le problème de l'utilisation de n = entier (fonction Instr ne renvoie rien puisque pas de virgule -> erreur)

Commentaire de Gobillot le 23/12/2005 01:28:42

- il y a des problèmes !!!!

  Roundinf(2.15, 2)  renvoit 2.14 au lieu de 2.15
  Roundsup(2.14, 2)  renvoit 2.15 au lieu de 2.14
  Roundapp(2.14, 2)  se plante
  Roundapp(2.141, 2) renvoit 214.09

- pourquoi travailler en String et pas directement en Double ?

Commentaire de Julien39 le 23/12/2005 09:24:05 administrateur CS

La source est modifiée et fonctionne (enfin j'espere), merci de votre aide

Commentaire de Gobillot le 23/12/2005 11:55:18

- Les calculs avec des chaînes n'apportent rien et pénalisent
  les performances.
  Tout calcul avec chaîne passe par une conversion en Double.

    Dim s As String
    Dim x As Variant
    s = 2
    
    MsgBox TypeName(s + 2) ' --> Double
    x = 2
    MsgBox TypeName(x)     ' --> Integer
    x = s + 0
    MsgBox TypeName(x)     ' --> Double


- Pour concaténer des chaînes, on utilise "&" et non pas "+"
  n = n & "0"


- Fonction Roundinf
  l'arrondi par défaut de 0,03 n'est pas 0.02


- Fonction Roundsup
  l'arrondi par excès de 0.01 n'est pas 0.02


- Les nombres négatifs ne sont pas traités
  faire la différence avec Fix() et Int()
  l'arrondi de -2.141 est:
    inférieur  -2.15
    supérieur  -2.14

- La Fonction Roundapp est bien trop compliquée

Private Function Roundapp(n As Double, e As Long) As Double
    Dim ex As Double
    
    ex = 10 ^ e
    Roundapp = Int(CDec(n) * ex + 0.5) / ex
    
End Function

- désolé de toutes ses remarques qui j'espèrent ne te vexeront pas.

il faut prendre en compte les défauts de calcul de VB:
   Int(0.03 * 100) donne 0.02
   Int(2.15 * 100) donne 2.14


Commentaire de Gobillot le 23/12/2005 12:00:34

- je corrige ma dernière remarque:

   Int(0.03 * 100) / 100 donne 0.02
   Int(2.15 * 100) / 100 donne 2.14

  mais l'erreur intervient avant la division:

   Int(0.03 * 100) donne 2
   Int(2.15 * 100) donne 214

Commentaire de violent_ken le 24/12/2005 12:54:54

Salut.
Je me permet de faire aussi quelques remarques :

-je ne comprend pas non plus l'utilisation du type string, qui d'ailleurs renvoie une erreur

-petites explications pour la concaténation :
msgbox "az" & "er" est possible
msgbox "az" + "er" est aussi possible, puisque les deux éléments sont des string
msgbox "az" & 5 est possible
msgbox "az" + 5 est IMPOSSIBLE (il faut mettre des guillemets pour que çà marche avec un +)
Sinon, utiliser msgbox "az" + str$(5)  mais attention, str$ créé un espace.

-l'encadrement de 12.22,2 renvoie 12.19<12.2<12.2  Attention aux bornes ! Il faut alors mettre <= ou bien mettre <12.21

Gobillot ==> je me permet de répondre à la place de Julien39 : RoundInf et RoundSup ne sont pas les arrondis par défaut/exces.
"La fonction Roundinf renvoie une valeure TOUJOURS INFERIERE à n" et de manière analogue pour RoundSup.
@+

Commentaire de Julien39 le 24/12/2005 13:20:29 administrateur CS

Je vais reprendre ce code et suivre vos conseils, le type string n'est en effet pas justifié.

Commentaire de Gobillot le 24/12/2005 13:32:54

heu non !

Roundinf doit renvoyer une valeur inférieure ou égale
Roundsup doit renvoyer une valeur supérieure ou égale

l'arrondi de zéro ne sera jamais 1
   Roundsup (0,0) => 1 ???? me semble étrange

l'arondi de 0.3 ne sera jamais 0.2
   Roundinf (0.3,1) => 0.2 ????

ces fonctions renvoient bien une valeur inférieure ou supérieure, sauf pour les valeurs négatives où là c'est totalement faux, mais ne peuvent en aucun cas servir comme fonctions d'arrondi.


Commentaire de Julien39 le 24/12/2005 14:28:09 administrateur CS

Tout ces résultats sont normaux, Roundsup(0,0) retourne une valeur approchée de 0 avec 0 chiffres après la virgule, donc la valeur retournée est le plus petit entier strictement supérieur à 0 c'est 1. Idem pour Roundinf(0.3,1) qui renvoi le plus grand nombre à 1 chiffre après la virgule.

Pour la dernière remarque elle me semble assez étrange sachant que la fonction Roundapp() est (lorsqu'elle fonctionne) totalement équivalente à la fonction Round() de VB6.

Dernière remarque qu'est qu'un arrondi, si je dit que 3 est une valeur approchée de pi c'est vrai même si il existe de meilleures valeurs, même 5 est une bonne valeur approchée de pi.
Ce n'est cependant pas satisfaisant j'en convient. Pour pouvoir dire si une valeur approchée est bonne il faut donner un degré à 1 près 3 est une bonne valeur approchée de pi
Comme 1 est une bonne valeur approchée de 0
Ce qui est vrai à 1 près n'est pas vrai à 0.1 près
À 0,1 près 0.2 est une bonne valeur approchée de 0.3

En bref tout n'est qu'une question de tolérance d'erreur.

Commentaire de Gobillot le 24/12/2005 15:04:03

oui mais le résultat est différent suivant la valeur:

Roundinf (0.2,1) ==> 0.2
Roundsup (0.2,1) ==> 0.3

    donc 0.2 <= 0.2 < 0.3

Roundinf (1.2,1) ==> 1.1
Roundsup (1.2,1) ==> 1.2

    donc 1.1 < 1.2 <= 1.2

c'est pas logique, parfois c'est la valeur inférieur qui donne l'égalité, parfois c'est la valeur supérieure, et ceci de façon aléatoire.
contrairement a ce que dit Violent_ken/
"La fonction Roundinf renvoie une valeur TOUJOURS INFERIERE à n et de manière analogue pour RoundSup."

exemple:
pour savoir le nombre de secteurs occupés par un fichier, j'ai besoin de connaître la valeur par excès. pour un multiple de 512 octets la fonction doit renvoyer l'égalité et non pas la valeur supérieure, j'ai pas besoin de secteurs supplémentaires.

Julien39 >>
comme tu as mis les fonctions dans un module on pourrait penser quelles sont faites pour des calculs d'arrondis, par défaut ou par excès, le mot "Round" prétant à confusion.
pour des valeurs où il y a l'égalité, donc pas de décimales à supprimer, le résultat est impévisible:
  0.5 <= 0.5 < 0.6  mais 0.5 < 0.6 <= 0.6

- tous ces problèmes viennent des calculs avec du Double
  alors supprimons les.
  en convertissant le Double en décimal, on a plus d'erreurs.
  Int() à la place de Fix(à permet d'être compatible avec les
  nombres négatifs.

Private Function Roundinf(n As Double, e As Long) As Double
    Dim ex As Double
    ex = 10 ^ e
    Roundinf = Int(CDec(n) * ex) / ex
End Function

- pour la fonction Roundsup, je vois pas d'autres possibilités
  que de tester s'il faut ajouter 1 ou pas.

Private Function Roundsup(n As Double, e As Long) As Double
    Dim ex As Double
    Dim x  As Variant
    Dim z  As Double
    ex = 10 ^ e
    x = CDec(n) * ex
    z = Fix(x)
    If z < x Then z = z + 1
    Roundsup = z / ex
End Function

Commentaire de violent_ken le 24/12/2005 20:27:40

Salut !
Gobillot ==> j'ai dit "La fonction Roundinf renvoie une valeur TOUJOURS INFERIERE à n".
Je l'ai cité entre guillemets, c'est parce que je le tire directement des commentaires de la source ! Le but des 2 fonctions n'est (pardonnez moi si je fait erreur, mais c'est ce que j'ai compris) pas de faire forcément des arrondis par défaut/excès, mais de donner des valeurs strictement inférieures/supérieures. C'est la source qui le dit !
Je suis tout à fait d'accord qu'une utilisation normale doit donner le résultat que tu attends, Gobillot, mais ce n'est peut être pas (ce n'est pas , si j'ai bien compris) forcément le but des deux fonctions.

Julien39 ==> "Comme 1 est une bonne valeur approchée de 0".
Attention ! On ne parle pas de 0 comme de n'importe quel réel.
On ne peut pas, par exemple, dire qu'au voisinage de 0 ln(1+x) est équivalent à 0.
"Arrondir à 0" est donc à "prendre avec des pincettes"

@+

Commentaire de Julien39 le 24/12/2005 20:43:01 administrateur CS

Non ce n'est pas du tout ce que je voulais dire, je ne prennais cet exemple que por expliquer que l'approximation peut également être très grossiere et ce n'est pas pour cela que ce n'est pas une bonne appproximation.
Je ne parlais que d'un cas isolé sans prétendre que cette approxiamtion soit bonne...

Il faut sortir ne reste pas devant ton PC un soir de réveillon de Noël!!!!

Commentaire de Gobillot le 26/12/2005 23:01:41

toujours la même chose à rajouter

approximation d'accord:
5 peut être la valeur approchée de 3 à 2 unités près.
mais ici, puisqu'on fournit un paramètre, on demande une valeur approchée précise à 1/(10^2) près


je cite:
"j'ai dit "La fonction Roundinf renvoie une valeur TOUJOURS INFERIERE à n"
on devrait obtenir alors  -1 < 0 < 1 à l'unité près ?
ben non c'est pas le cas, parfois on peut avoir l'égalité.

- ce que dit Violent_ken:
   p < x < p + 1   (il faudrait p + 2 dans certain cas)

- ce que fait la fonction:
   1er cas:   p <= x < p + 1
   2eme cas:  p < x <= p + 1

- ce que j'aurais préféré:
   p <= x <= p + 1

- on peut remarquer que lorsqu'on fait les calculs intermédiaires
  on n'a pas les mêmes résultats:

Public Function Roundinf(n As String, e As Long) As String
  dim temp As Double
  temp = (10 ^ e) * n
  Roundinf = Int(temp) / (10 ^ e)
End Function

ca qui me fait dire, que le résultat obtenu par la Fonction, n'est pas voulu mais est suite a des erreurs de calcul étranges (mais peut être explicables, si quelqu'un peut ?) de Vb.

Rappel:
Int(2.3 * 10)   donne 22
Int(2.4 * 10)   donne 23
Int(2.15 * 100) donne 214

mais:
(2.15 * 100) donne 215
Int(215)     donne 215


 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

ARRONDIR DECIMAL VB.NET [ par spike62300 ] Bonjour ,voila j'ai besoin pour mon developpement d'arrondir certains chiffres apres la virgul. Pour l'instant ca serait l'arrondi le plus basique15.2 arrondir à l entier [ par spike62300 ] Bonjour a tous, je suis sous vb.net et je chercher une solution pour arrondir certains calculs que j'execute.Je souhaite arrondir &#224; l'entier 0, j arrondir un nombre [ par titidegre ] bonjour &#224; toutes et &#224; tous(y a aussi des filles qui code) apres un cacul ma variable me donne un resultat, par exemple de 2.4978, j'aimerai SMS text--->PDU (delphi-->vb) [ par bilalstar ] salut,quelqu'un peut m'aider en me transformant cette fonction de Delphi vers VB.Car je connais pas le Language Delphi.c'est d'ailleurs un entrainemen SMS test-->PDU [ par bilalstar ] salut,quelqu'un peut m'aider en me transformant une portion de cette fonction de Delphi vers VB.Car je connais pas le Language Delphi.c'est d'ailleurs Arrondir à l'entier supérieur [ par pcvesoul ] Bonjour.Existe-t-il une formule permettant d'arrondir un nombre non entier &#224; l'entier sup&#233;rieur : 12 reste 12 mais 12.1 devient 13 ?Mon but Approximation par la methode de moindre carrés [ par ust3000 ] Salut &#224; tous et &#224; toutes. Dans le cadre d'un projet &#233;tudiant, je cherche &#224; mettre en oeuvre une m&#233;thode d'approximation style Arrondir un nombre entier [ par gbegnonghislain ] &nbsp; Salut &#224; tous, ce que je veux en fait, c'est arrondir un montant au millier de franc pr&#234;t pour ensuite faire d'autres op&#233;ration a Arrondir [ par darxvirus ] Bonjour,j'aimerai savoir comment arrondir l'argent a 5 ou a 0 a la fin exemple: 23.33 --&gt; 23.35&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbs Arrondir un nombre [ par bichoncanada ] Bonjour,Je voudrais savoir la fonction permettant d'arrondir un nombre. J'ai une ProgressBar et elle me met des nombres avec des chiffres apr&#233;s l


Nos sponsors


Sondage...

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,998 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales