Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

ENCADREMENTS ET APPROXIMATIONS


Information sur la source

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é: 7 257 / 211

Note :
Aucune note

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&post=ok
 

Fichier Zip

Pour les "Membres Club", vous pouvez 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

Commentaires et avis

signaler à un administrateur
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)

signaler à un administrateur
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 ?

signaler à un administrateur
Commentaire de Julien39 le 23/12/2005 09:24:05

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

signaler à un administrateur
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


signaler à un administrateur
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

signaler à un administrateur
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.
@+

signaler à un administrateur
Commentaire de Julien39 le 24/12/2005 13:20:29

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

signaler à un administrateur
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.


signaler à un administrateur
Commentaire de Julien39 le 24/12/2005 14:28:09

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.

signaler à un administrateur
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

signaler à un administrateur
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"

@+

signaler à un administrateur
Commentaire de Julien39 le 24/12/2005 20:43:01

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

signaler à un administrateur
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

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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
Temps d'éxécution de la page : 0,437 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.