| addition d'entiers avec des réels | |
|
|
Auteur | Message |
---|
bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: addition d'entiers avec des réels Sam 26 Jan 2013 - 20:01 | |
| Bonsoir à tous Je sais qu'en fouillant dans le forum, le problème d'addition d'entier ou division d'entier a été abordé et qu'il y avait un bug que Jack a résolu. Mais il y a un truc qui me gène. Voyez le code suivant: - Code:
-
dim i%,e%,r:height 0,screen_y-40 list 1:left 1,50:width 1,150:height 1,150:print_target_is 1 r=0.5 repeat e%=r print "reel="+str$(r)+" donne l'entier :"+str$(e%):r=r+1 until r>8.5
print_target_is 0 i%=1 print i% : ' => 1 i%=i%+0.5 print i% : ' => 2 i%=i%+0.5 print i% : ' => 2 print
i%=2 print i% : ' => 2 i%=i%+0.5 print i% : ' => 2 i%=i%+0.5 print i% : ' => 2 => devrait donner 3? print
i%=3 print i% : ' => 3 i%=i%+0.5 print i% : ' => 4 i%=i%+0.5 print i% : ' => 4 print
i%=4 print i% : ' => 4 i%=i%+0.5 print i% : ' => 4 i%=i%+0.5 print i% : ' => 4 => devrait donner 5? print
i%=1 print i% : ' => 1 i%=i%+1.5 print i% : ' => 2 i%=i%+1.5 print i% : ' => 4 print
i%=2 print i% : ' => 2 i%=i%+1.5 print i% : ' => 4 i%=i%+1.5 print i% : ' => 6 => devrait donner 5? print
i%=3 print i% : ' => 3 i%=i%+1.5 print i% : ' => 4 i%=i%+1.5 print i% : ' => 6 print
i%=4 print i% : ' => 4 i%=i%+1.5 print i% : ' => 6 i%=i%+1.5 print i% : ' => 8 =>devrait donner 7? print
Où alors il y a quelque chose que je ne saisis pas avec les entiers et les réels! Quelqu'un peut-il me donner une explication? A+ | |
|
| |
Jean Claude
Nombre de messages : 5950 Age : 70 Localisation : 83 Var Date d'inscription : 07/05/2009
| Sujet: Re: addition d'entiers avec des réels Sam 26 Jan 2013 - 21:11 | |
| Salut bignono
J'ai un peu de mal à suivre ton code; mais je pense que tu ne peux pas déclare 0.5 pour un entier%.
0.5 = valeur
1 = valeur% (obligatoirement un nombre sans décimale)
A+ | |
|
| |
Invité Invité
| Sujet: Re: addition d'entiers avec des réels Sam 26 Jan 2013 - 23:35 | |
| Bonsoir. Je réponds rapidement, j'ai fait une recherche rapide, mais j'ai pas trouvé. La question a déjà été posé. Je me souviens de cette réponse (je ne pense pas me tromper), mais il me semble que Jack a répondu que la représentation était selon le choix des variables, mais que les calculs en interne étaient faite sur des réels pour une meilleurs précision.
En espérant que je suis dans le vrai avec une mémoire pas trop défaillante. Bonsoir. |
|
| |
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: addition d'entiers avec des réels Sam 26 Jan 2013 - 23:50 | |
| Salut tout le monde. Il n’y a pas de bug !! Mais il suffit de savoir !! Panoramic , comme la plus part des langages, utilise ce qu’on appelle l’arrondi au pair le plus proche dit arrondi bancaireDans le problème qui se pose pour arrondir un réel en un entier, sachez qu’il existe plusieurs façons d’arrondir une valeur. Arrondi vers le bas Arrondi vers le haut Arrondi par troncature Arrondi par éloignement de zéro Arrondi au plus proche Arrondi au pair le plus proche (arrondi bancaire)Arrondi à l’impair le plus proche Arrondi stockastique Arrondi alterné ******************************************************************************************** Voici un code contenant une SUB RoundUp() qui effectue l’arrondi vers le haut. J'ai déjà posté cette SUB dans un autre topic - Code:
-
dim i, result% height 0,620 list 1:top 1, 20 :left 1,50:width 1,150:height 1,550:print_target_is 1 ' ---------------------- for i = 1 to 5 step 0.1 RoundUp(i) if frac(i) = 0.5 print i ; " RoundUp à : "; result%; " ======> " else print i ; " RoundUp à : "; result% end_if next i ' ----------------------- list 2:top 2,20 :left 2,250:width 2,150:height 2,550 : print_target_is 2 for i = 1 to 5 step 0.1 result% = i : print i ; " Arrondi à : "; result% next i ' ------------------ end ' ****************************************************************************** ' Arrondit un réel en un entier le plus proche SUB RoundUp(x) result% = int(x) + int(frac(x)*2) end_sub ' ******************************************************************************
Dans la liste à gauche les résultats de ma procédure (remarquez les valeurs devant la 2ème et la 4ème flèche). Dans la liste à droite les résultats sont ceux qu'utilise PANORAMIC (Arrondi bancaire). REMARQUEChaque type d'arrondi a son utilisation particulière.
Dernière édition par papydall le Dim 27 Jan 2013 - 4:21, édité 2 fois | |
|
| |
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: addition d'entiers avec des réels Dim 27 Jan 2013 - 1:51 | |
| Voici 2 SUBs : La 1ère : Arrondi asymétrique vers le basLa 2ème : Arrondi arithmétique asymétriqueEt un petit code pour les tester. - Code:
-
dim result, x, facteur x = 123.456789 facteur = 1000: ' pour obtenir un entier, faire facteur = 1 ' le nombre des zéros dans 'facteur' indique le nombre des chiffres ' après le point décimal
print " Arrondi asymétrique vers le bas" : print print " ";x ; " =====> "; Round_Asym_Down(x,facteur) : print result print "-";x;" =====> "; Round_Asym_Down(0-x,facteur) : print result : print
print " Arrondi arithmétique asymétrique" :print print " ";x;" =====> ";
Round_Asym_Arith(x,facteur) : print result print "-";x;" =====> "; Round_Asym_Arith(0-x,facteur) : print result : print
end ' ***************************************************************************** ' Arrondi asymétrique vers le bas SUB Round_Asym_Down(x,facteur) result = Int(X * facteur) / facteur END_SUB ' ****************************************************************************** ' Arrondi arithmétique asymétrique SUB Round_Asym_Arith(X,facteur) result = Int(x *facteur +0.5)/facteur END_SUB ' *****************************************************************************
| |
|
| |
Francis-mr
Nombre de messages : 186 Date d'inscription : 26/11/2012
| Sujet: Re: addition d'entiers avec des réels Dim 27 Jan 2013 - 8:51 | |
| Bonjour, Moi aussi je me suis aperçu du problème qui n'en est pas vraiment un, car je m'en suis sorti avec la partie fractionnaire. Merci à papydall pour ses explications, maintenant c'est beaucoup plus clair dans ma tête. | |
|
| |
bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: addition d'entiers avec des réels Dim 27 Jan 2013 - 11:37 | |
| Bonjour Papydall et à tous les panoramiciens, Bien compris ton explication, merci Mais j'ai un autre code, qui fait donc un "arrondi bancaire": - Code:
-
dim i,e%,k(10):width 0,700:height 0,screen_y-38
list 1:left 1,0:width 1,150:height 1,height(0)-38:print_target_is 1:print " PAS DE 0.5 " for i=1 to 10:k(i)=0:next i for i=1 to 10 step 0.5 e%=i:inc() print i;" => ";str$(e%) next i print:for i=2 to 9:print "égal à ";i;" => ";k(i);" fois":next i
list 2:left 2,175:width 2,150:height 2,height(0)-38:print_target_is 2:print " PAS DE 0.25 " for i=1 to 10:k(i)=0:next i for i=1 to 10 step 0.25 e%=i:inc() print i;" => ";str$(e%) next i print:for i=2 to 9:print "égal à ";i;" => ";k(i);" fois":next i
list 3:left 3,350:width 3,150:height 3,height(0)-38:print_target_is 3:print " PAS DE 0.2 " for i=1 to 10:k(i)=0:next i for i=1 to 10 step 0.2 e%=i:inc() print i;" => ";str$(e%) next i print:for i=2 to 9:print "égal à ";i;" => ";k(i);" fois":next i
list 4:left 4,525:width 4,150:height 4,height(0)-38:print_target_is 4:print " PAS DE 0.1 " for i=1 to 10:k(i)=0:next i for i=1 to 10 step 0.1 e%=i:inc() print i;" => ";str$(e%) next i print:for i=2 to 9:print "égal à ";i;" => ";k(i);" fois":next i
end
sub inc() k(e%)=k(e%)+1 end_sub
A+ | |
|
| |
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: addition d'entiers avec des réels Dim 27 Jan 2013 - 15:27 | |
| Salut Bignono, Francis-mr et tous les Panoramiciens. Dans ton code, Bignono, en dessous de chaque liste, tu as indiqué les nombres des fois, ce qui donne : 3 fois ; 1 fois ; 3 fois ; 1 fois etc 5 fois ; 3 fois ; 5 fois ; 3 fois etc Cette manière de faire des arrondis s’appelle l’arrondi alterné.Elle est voulue et même souhaitée (en calcul statistique, bancaire, etc) car elle évite (autant que faire se peut) d’accumuler les erreurs d’arrondis. La méthode consiste à arrondir alternativement une fois vers le haut et une autre fois vers le bas. Voici mon code - Code:
-
dim i,n,entier%,somme_entier,somme_reel, moyenne_reel,moyenne_entier,pas dim result%,somme_entier_up,moyenne_entier_up dim epsilon : epsilon = power(10,0-5) init(0.2): init(0.25) : init(0.5) : init(0.75)
print "***********************************************************************" print " CONSTATATION :" print " L'arrondi fait par PANORAMIC (arrondi alterné) donne un meilleur résultat" print " en diminuant les accumulations des erreurs dùes aux arrondis" : print print " Comparez les résultats donnés par moyenne des entiers (arrondi fait par PANORAMIC)et" print " ceux donnés par moyenne des entiers UP(ma procédure:arrondi vers l'entier supérieur)" end ' ------------------------------------------------------------------------------ SUB init(step_pas) somme_entier = 0 : somme_reel = 0 : somme_entier_up = 0 : moyenne_entier_up = 0 n = 0 : pas = step_pas : calcul() : affiche() END_sub ' ----------------------------------------------------------------------------- ' Arrondit un réel en un entier le plus proche SUB RoundUp(x) result% = int(x) + int(frac(x)*2) end_sub ' ****************************************************************************** SUB affiche() moyenne_entier = somme_entier / n moyenne_reel = somme_reel /n moyenne_entier_up = somme_entier_up/n print "Nombres de 1 à 10 avec un pas de "; str$(pas) : print print "Somme des entiers = "; somme_entier; " "; "Moyenne des entiers = " ; moyenne_entier print "Somme des réels = "; somme_reel ; " "; "Moyenne des réels = "; moyenne_reel print "Somme des entiers UP = ";somme_entier_up;" ";"Moyenne des entiers Up = ";moyenne_entier_up print "-----------------------------------------------------------------------" end_sub ' ----------------------------------------------------------------------------- SUB calcul() for i = 1 to 10 + epsilon step pas n = n + 1 entier% = i : somme_entier = somme_entier + entier% somme_reel = somme_reel + i RoundUp(i) somme_entier_up = somme_entier_up + result% next i end_sub ' *****************************************************************************
Ma conclusion :L’arrondi fait par PANORAMIC ( arrondi alterné) est l’un des meilleurs (si ce n’est pas le meilleur) ! Il donne des résultats qui se rapprochent le plus de la valeur exacte. Mais on ne peut jamais connaître la valeur exacte d’une grandeur : seulement une valeur approchée. Selon l’objectif à atteindre, on peut préférer un type d’arrondi plutôt qu’un autre. Chacun peut parfaitement coder une procédure qui réalise un arrondi à sa convenance. Pour des plus amples informations, regarder ici | |
|
| |
bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: addition d'entiers avec des réels Dim 27 Jan 2013 - 16:03 | |
| @Papydall, Merci beaucoup de ta réponse et de tes explications. Je n'ai jamais étudié l'arrondi alterné, et maintenant je me rends compte qu'effectivement la méthode est excellente surtout pour arrondir des pourcentages afin qu'au final la totalité fasse 100%! Merci encore, A+ PS: ton lien est très interressant et toutes les méthodes d'arrondis sont bien espliquées! | |
|
| |
papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Re: addition d'entiers avec des réels Dim 27 Jan 2013 - 16:11 | |
| - bignono a écrit:
- @Papydall,
..... PS: ton lien est très interressant et toutes les méthodes d'arrondis sont bien espliquées! On voit bien qu'on peut toujours espliquer les choses! | |
|
| |
bignono
Nombre de messages : 1127 Age : 67 Localisation : Val de Marne Date d'inscription : 13/11/2011
| Sujet: Re: addition d'entiers avec des réels Dim 27 Jan 2013 - 20:48 | |
| Bien vu Papydall! La prochaine fois je vais m'axpliquer à ne plus faire de faute de frappe! Que des fautes d'ortho-frappe! | |
|
| |
Contenu sponsorisé
| Sujet: Re: addition d'entiers avec des réels | |
| |
|
| |
| addition d'entiers avec des réels | |
|