Novembre 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | | | 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 | | Calendrier |
|
|
| Je ne sais plus faire une addition!! | |
| | |
Auteur | Message |
---|
Invité Invité
| Sujet: Je ne sais plus faire une addition!! Lun 28 Fév 2011 - 2:25 | |
| Etant en attende d' une idée avec mes problèmes de fichiers, pour me changer les idées, j'ai fais ce programme, car je ne sais plus compter??? Par contre j'ai fais une drôle de constatation au final. - Code:
-
' méthode d'addition
dim nombre%(10) ,a% ,l% ,a$(10) ,b$ ,c$ ,b% ,col% ,cumul%,pt% ,nb% data 125735,42572,99233,7846647,86559,46956,124987,38455,155583,28787924 for a%=1 to 10:read nombre%(a%):next a%
width 0,1000:font_size 0,14:font_name 0,"Courier New":height 0,600
list 1:height 1,460:width 1,30:left 1,10 list 2:height 2,460:width 2,30:left 2,40 list 3:height 3,460:width 3,30:left 3,70 list 4:height 4,460:width 4,30:left 4,100 list 5:height 5,460:width 5,30:left 5,130 list 6:height 6,460:width 6,30:left 6,160 list 7:height 7,460:width 7,30:left 7,190 list 8:height 8,460:width 8,30:left 8,220 list 9:height 9,460:width 9,30:left 9,250
edit 11:top 11,470:left 11,10:width 11,30 :text 11,0 edit 12:top 12,470:left 12,40:width 12,30 :text 12,0 edit 13:top 13,470:left 13,70:width 13,30 :text 13,0 edit 14:top 14,470:left 14,100:width 14,30:text 14,0 edit 15:top 15,470:left 15,130:width 15,30:text 15,0 edit 16:top 16,470:left 16,160:width 16,30:text 16,0 edit 17:top 17,470:left 17,190:width 17,30:text 17,0 edit 18:top 18,470:left 18,220:width 18,30:text 18,0 edit 19:top 19,470:left 19,250:width 19,30:text 19,0 alpha 53:left 53,320:top 53,470:caption 53,"total des colonnes"
edit 21:top 21,500:left 21,10:width 21,30 :text 21,0 edit 22:top 22,500:left 22,40:width 22,30 :text 22,0 edit 23:top 23,500:left 23,70:width 23,30 :text 23,0 edit 24:top 24,500:left 24,100:width 24,30:text 24,0 edit 25:top 25,500:left 25,130:width 25,30:text 25,0 edit 26:top 26,500:left 26,160:width 26,30:text 26,0 edit 27:top 27,500:left 27,190:width 27,30:text 27,0 edit 28:top 28,500:left 28,220:width 28,30:text 28,0 edit 29:top 29,500:left 29,250:width 29,30:text 29,0 edit 30:top 30,500:left 30,280:width 30,30:text 30,0 alpha 54:left 54,320:top 54,500:caption 54,"total des retenues"
edit 31:top 31,530:left 31,10:width 31,30 :font_bold 31 edit 32:top 32,530:left 32,40:width 32,30 :font_bold 32 edit 33:top 33,530:left 33,70:width 33,30 :font_bold 33 edit 34:top 34,530:left 34,100:width 34,30:font_bold 34 edit 35:top 35,530:left 35,130:width 35,30:font_bold 35 edit 36:top 36,530:left 36,160:width 36,30:font_bold 36 edit 37:top 37,530:left 37,190:width 37,30:font_bold 37 edit 38:top 38,530:left 38,220:width 38,30:font_bold 38 edit 39:top 39,530:left 39,250:width 39,30:font_bold 39 alpha 55:left 55,320:top 55,530:caption 55,"résultat colonne par colonne" edit 56:hide 56
edit 51:width 51,300:height 51,30:color 51,255,204,50 edit 52:width 52,500:height 52,30:color 52,255,100,100:hide 52
list 50:left 50,650:width 50,30:height 50,200:color 50,204,255,51:hint 50,"ordre de lecture des colonnes memo 100:width 100,250:left 100,700:height 100,300 rem afficher les chiffres des nombres for a%=1 to 10 b$=right$("000000000000"+str$(nombre%(a%)),9) for b%=1 to 9 item_add b%,mid$(b$,b%,1):item_add b%,"" next b% b$=right$(" "+str$(nombre%(a%)),9) item_add 100,b$ next a% for a%=2 to 9:item_add a%,"":next a% c$=""
rem faire un choix quelconque du calcul des colonnes repeat a%=rnd(9) if instr (c$,str$(a%))=0 and a%>0 then item_add 50,a%:c$=c$+str$(a%) until count(50)=9 or scancode=27
rem effacer les listes qui n'ont que des zéros for a%=9 to 1 step -1: ' les colonnes, on regarde si toutes les lignes sont à zéro l%=0 for b%=1 to count(1) step 2:' ligne if item_read$( a%,b%)<>"0" then l%=l%+1 next b% if l%=0 then exit_for next a%
rem les listes effacées, on les retirent pour le calcul for b%=1 to a% clear b% for a%=1 to count(50) if val(item_read$(50,a%))=b% then item_delete 50,a% :exit_for next a% next b% message "on commence le calcul de l'addition, selon un ordre aléatoire, celui de la liste verte" rem on calcule les colonnes au hazard for col%=1 to count(50) if scancode=27 then exit_for a%=item_read$(50,col%): color a%,255,255,0 left 51,left(a%) :left 52,left(a%) rem on commence cumul%=0: pt%=0 for b%=1 to count(a%)-1 step 2 top 51,b%*21-21:top 52,top(51)+21 nb%=item_read$(a%,b%) text 51,str$(nb%)+" + "+str$(cumul%)+" = "+str$(cumul%+nb%) cumul%=cumul%+nb% if cumul%=>11 then show 52:else:hide 52
if cumul%=>11 text 52,str$(cumul%)+" - 11 = " + str$(cumul%-11)+" on marque un point" cumul%=cumul%-11:pt%=pt%+1:item_delete a%,b%+1:item_insert a%,b%+1,"*" wait 200 end_if repeat:until scancode=0:repeat:until scancode=32 or scancode=27 if scancode=27 then exit_for next b% rem affichage des calculs de la colonne: le résultat et les retenues color a%+10,255,255,0:color a%+20,255,0,0 text a%+10,cumul% text a%+20,pt% wait 1500:color a%+10,255,255,255:color a%+20,255,255,255
color a%,255,255,255
if scancode=27 then exit_for next col% :hide 51 text 52,"":c$="" message "maintenant on fait le calcul final" rem resultat final cumul%=0 :hide 52 : show 51 for a%=9 to 1 step -1 text 51,"" :hide 52 if c$<>"" then text 51,"retenu: "+c$+" + " color a%+10,0,255,0: left 51,left(a%)+30:top 51,470:text 51, text$(51)+text$(a%+10)+" + " repeat:until scancode=0:repeat:until scancode=32 color a%+20,255,255,0:top 51,500:text 51,text$(51)+text$(a%+20)+" + " repeat:until scancode=0:repeat:until scancode=32 color a%+21,255,0,0 :left 51,left(a%)+60
cumul%=cumul%+val(text$(a%+10))+val(text$(a%+20))+val(text$(a%+21)) text 51,text$(51)+ text$(a%+21) + " = " + str$(cumul%) color a%+30,204,204,255
if cumul%<10 text a%+30,cumul%:cumul%=0:c$="" else show 52:left 52,left(51):top 52,top(51)+30 text 56,cumul% b$=right$(text$(56),1):c$=left$(text$(56),len(text$(56))-1) text a%+30,b$:cumul%=val(c$) text 52,"dépassement, on pose:"+b$+" on retient:"+c$ end_if text 56,0 repeat:until scancode=0:repeat:until scancode=32 color a%+10,255,255,255:color a%+20,255,255,255:color a%+21,255,255,255:color a%+30,255,255,255 next a% hide 51:hide 52
' contrôle cumul%=0 for a%=1 to 10 cumul%=cumul%+nombre%(a%) next a% item_add 100,"--------------------" item_add 100,cumul% message "comparez le résultat du bas, et celui qui vient d'être fait dans la liste de droite"+chr$(13)+"A votre avis? quel est le bon résultat? voyez avec vos calculatrice!"
Une précision que j'ai oublié: il faut appuyer sur <SPACE> pour avancer apporté une modification à 13.40 hla discution de ce sujet s'est faite en rapport avec la version Panoramic du 12 février 2011, version 0.9.21i3, donc le bug concerne cette version. Depuis Jack a éditer une nouvelle version, celle du 4 mars 2011 0.9.21i4 qui corrige le bug (ceci pour ceux qui liront ce sujet dans les mois à venir.,
Dernière édition par cosmos70 le Sam 5 Mar 2011 - 16:00, édité 2 fois |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Je ne sais plus faire une addition!! Lun 28 Fév 2011 - 10:06 | |
| Vraiment très étonnant ! Ma calculette donne évidemment le bon résultat (celui de gauche). Et on voit avec un rapide calcul, uniquement sur les unités de la liste de droite, que la somme des unités doit donner le chiffre 1 dans la colonne des unités, et pas le chiffre 2 ! Vraiment étonnant ! | |
| | | Invité Invité
| Sujet: Re: Je ne sais plus faire une addition!! Lun 28 Fév 2011 - 13:49 | |
| J'avais fait une petite erreur. Celà ne fait pas de différence avec les nombres, tel qu'ils sont placés, elle se rattrapait la ligne suivante. Si cela s'était produit sur la ligne du bas des colonnes, je crois qu'il y aurait eu une erreur.
Dans les calculs, dès qu'on atteint 11, on met une retenu, et on soustrait onze, et là je l'avais fait à plus que onze ligne 107 et 109. Il y a un bug sur les additions, et cela a été la surprise de cette nuit. Je cherchais l'erreur sur mes opérations, et ne la trouvait pas, alors que c'est Panoramic qui provoque l'erreur. J'ai fait les essais avec le cumul du tableau nombre%() et aussi celui du memo, en pensant qu'il y avait un bug sur les tableaux, cela avait je crois déjà été le cas. Mais c'est le même résultat.
Je voulais mettre des nombres aléatoires, du coup pour bien montrer le bug, c'est resté ainsi. |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Lun 28 Fév 2011 - 19:37 | |
| J'ai eu le même pb avec mon inutilitaire pour les tables mais j'avoue que j'ai lâchement abandonné. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Je ne sais plus faire une addition!! Lun 28 Fév 2011 - 22:09 | |
| Je me suis permis d'apporter une petite modif dans ton programme. Dans le memo 100, j'ai ajouté une seconde colonne donnant la somme, ligne par ligne, des nombres du début jusqu'à cette ligne (incluse). Et on voit que l'erreur de calcul se produit sur la toute dernière addition: - Code:
-
' méthode d'addition
dim nombre%(10) ,a% ,l% ,a$(10) ,b$ ,c$ ,b% ,col% ,cumul%,pt% ,nb% data 125735,42572,99233,7846647,86559,46956,124987,38455,155583,28787924 for a%=1 to 10:read nombre%(a%):next a%
width 0,1000:font_size 0,14:font_name 0,"Courier New":height 0,600
list 1:height 1,460:width 1,30:left 1,10 list 2:height 2,460:width 2,30:left 2,40 list 3:height 3,460:width 3,30:left 3,70 list 4:height 4,460:width 4,30:left 4,100 list 5:height 5,460:width 5,30:left 5,130 list 6:height 6,460:width 6,30:left 6,160 list 7:height 7,460:width 7,30:left 7,190 list 8:height 8,460:width 8,30:left 8,220 list 9:height 9,460:width 9,30:left 9,250
edit 11:top 11,470:left 11,10:width 11,30 :text 11,0 edit 12:top 12,470:left 12,40:width 12,30 :text 12,0 edit 13:top 13,470:left 13,70:width 13,30 :text 13,0 edit 14:top 14,470:left 14,100:width 14,30:text 14,0 edit 15:top 15,470:left 15,130:width 15,30:text 15,0 edit 16:top 16,470:left 16,160:width 16,30:text 16,0 edit 17:top 17,470:left 17,190:width 17,30:text 17,0 edit 18:top 18,470:left 18,220:width 18,30:text 18,0 edit 19:top 19,470:left 19,250:width 19,30:text 19,0 alpha 53:left 53,320:top 53,470:caption 53,"total des colonnes"
edit 21:top 21,500:left 21,10:width 21,30 :text 21,0 edit 22:top 22,500:left 22,40:width 22,30 :text 22,0 edit 23:top 23,500:left 23,70:width 23,30 :text 23,0 edit 24:top 24,500:left 24,100:width 24,30:text 24,0 edit 25:top 25,500:left 25,130:width 25,30:text 25,0 edit 26:top 26,500:left 26,160:width 26,30:text 26,0 edit 27:top 27,500:left 27,190:width 27,30:text 27,0 edit 28:top 28,500:left 28,220:width 28,30:text 28,0 edit 29:top 29,500:left 29,250:width 29,30:text 29,0 edit 30:top 30,500:left 30,280:width 30,30:text 30,0 alpha 54:left 54,320:top 54,500:caption 54,"total des retenues"
edit 31:top 31,530:left 31,10:width 31,30 :font_bold 31 edit 32:top 32,530:left 32,40:width 32,30 :font_bold 32 edit 33:top 33,530:left 33,70:width 33,30 :font_bold 33 edit 34:top 34,530:left 34,100:width 34,30:font_bold 34 edit 35:top 35,530:left 35,130:width 35,30:font_bold 35 edit 36:top 36,530:left 36,160:width 36,30:font_bold 36 edit 37:top 37,530:left 37,190:width 37,30:font_bold 37 edit 38:top 38,530:left 38,220:width 38,30:font_bold 38 edit 39:top 39,530:left 39,250:width 39,30:font_bold 39 alpha 55:left 55,320:top 55,530:caption 55,"résultat colonne par colonne" edit 56:hide 56
edit 51:width 51,300:height 51,30:color 51,255,204,50 edit 52:width 52,500:height 52,30:color 52,255,100,100:hide 52
list 50:left 50,650:width 50,30:height 50,200:color 50,204,255,51:hint 50,"ordre de lecture des colonnes memo 100:width 100,250:left 100,700:height 100,300 rem afficher les chiffres des nombres cumul% = 0 for a%=1 to 10 cumul% = cumul% + nombre%(a%) b$=right$("000000000000"+str$(nombre%(a%)),9) for b%=1 to 9 item_add b%,mid$(b$,b%,1):item_add b%,"" next b% b$=right$(" "+str$(nombre%(a%)),9) + right$(" "+str$(cumul%),9) item_add 100,b$ next a% for a%=2 to 9:item_add a%,"":next a% c$=""
rem faire un choix quelconque du calcul des colonnes repeat a%=rnd(9) if instr (c$,str$(a%))=0 and a%>0 then item_add 50,a%:c$=c$+str$(a%) until count(50)=9 or scancode=27
rem effacer les listes qui n'ont que des zéros for a%=9 to 1 step -1: ' les colonnes, on regarde si toutes les lignes sont à zéro l%=0 for b%=1 to count(1) step 2:' ligne if item_read$( a%,b%)<>"0" then l%=l%+1 next b% if l%=0 then exit_for next a%
rem les listes effacées, on les retirent pour le calcul for b%=1 to a% clear b% for a%=1 to count(50) if val(item_read$(50,a%))=b% then item_delete 50,a% :exit_for next a% next b% message "on commence le calcul de l'addition, selon un ordre aléatoire, celui de la liste verte" rem on calcule les colonnes au hazard for col%=1 to count(50) if scancode=27 then exit_for a%=item_read$(50,col%): color a%,255,255,0 left 51,left(a%) :left 52,left(a%) rem on commence cumul%=0: pt%=0 for b%=1 to count(a%)-1 step 2 top 51,b%*21-21:top 52,top(51)+21 nb%=item_read$(a%,b%) text 51,str$(nb%)+" + "+str$(cumul%)+" = "+str$(cumul%+nb%) cumul%=cumul%+nb% if cumul%=>11 then show 52:else:hide 52
if cumul%=>11 text 52,str$(cumul%)+" - 11 = " + str$(cumul%-11)+" on marque un point" cumul%=cumul%-11:pt%=pt%+1:item_delete a%,b%+1:item_insert a%,b%+1,"*" wait 200 end_if repeat:until scancode=0:repeat:until scancode=32 or scancode=27 if scancode=27 then exit_for next b% rem affichage des calculs de la colonne: le résultat et les retenues color a%+10,255,255,0:color a%+20,255,0,0 text a%+10,cumul% text a%+20,pt% wait 1500:color a%+10,255,255,255:color a%+20,255,255,255
color a%,255,255,255
if scancode=27 then exit_for next col% :hide 51 text 52,"":c$="" message "maintenant on fait le calcul final" rem resultat final cumul%=0 :hide 52 : show 51 for a%=9 to 1 step -1 text 51,"" :hide 52 if c$<>"" then text 51,"retenu: "+c$+" + " color a%+10,0,255,0: left 51,left(a%)+30:top 51,470:text 51, text$(51)+text$(a%+10)+" + " repeat:until scancode=0:repeat:until scancode=32 color a%+20,255,255,0:top 51,500:text 51,text$(51)+text$(a%+20)+" + " repeat:until scancode=0:repeat:until scancode=32 color a%+21,255,0,0 :left 51,left(a%)+60
cumul%=cumul%+val(text$(a%+10))+val(text$(a%+20))+val(text$(a%+21)) text 51,text$(51)+ text$(a%+21) + " = " + str$(cumul%) color a%+30,204,204,255
if cumul%<10 text a%+30,cumul%:cumul%=0:c$="" else show 52:left 52,left(51):top 52,top(51)+30 text 56,cumul% b$=right$(text$(56),1):c$=left$(text$(56),len(text$(56))-1) text a%+30,b$:cumul%=val(c$) text 52,"dépassement, on pose:"+b$+" on retient:"+c$ end_if text 56,0 repeat:until scancode=0:repeat:until scancode=32 color a%+10,255,255,255:color a%+20,255,255,255:color a%+21,255,255,255:color a%+30,255,255,255 next a% hide 51:hide 52
' contrôle cumul%=0 for a%=1 to 10 cumul%=cumul%+nombre%(a%) next a% item_add 100,"--------------------" item_add 100,cumul% message "comparez le résultat du bas, et celui qui vient d'être fait dans la liste de droite"+chr$(13)+"A votre avis? quel est le bon résultat? voyez avec vos calculatrice!"
| |
| | | Invité Invité
| Sujet: Re: Je ne sais plus faire une addition!! Lun 28 Fév 2011 - 22:46 | |
| Merci, les grandes idées se rencontrent. J'avais fait la même chose. J'ai changé les nombres pour essayer de voir ligne par ligne. C'est sur les grands nombres que se produit l'erreur, et c'est pour cela que l'on voit à la fin. Je ne suis pas un spécialiste des mots, des mots doubles ou autre. Ceux qui le sont pourraient peut-être faire un rapprochement.
Merci pour ta curiosité. |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Je ne sais plus faire une addition!! Lun 28 Fév 2011 - 23:36 | |
| J'y ai pensé, aux limites des mots, mais cela créerait des problèmes "à gauche" par la perte de positions significatives à gauche, ou en passant à des valeurs négatives. Mais on en est encore loin, de ces limites: avec des mots de 32 bits (4 octets) pour un entier, les chiffres que tu utilises devraient passer haut la main. Le mystère reste entier. A moins qu'il y ait un problème de conversion entre représentation binaire et alpha. Mais il y a vraiment un problème. Et de plus en plus bizarre: si tu fais l' addition de l'avant-dernière somme intermédiaire avec nombre%(10): item_add 100,8566727+nombre%(10) tu obtiens bien le BON résultat ! Mais si tu fais cumul% = 8566727+nombre%(10) item_add 100,cumul% le résultat est FAUX ! Le problème vient de la conversion de la valeur en provenance de la variable cumul%, il ne réside pas dans le calcul lui-même ! J'ai ajouté 2 lignes au mémo 100: la première est basée sur la variable cumul% (FAUX), la seconde sur le résultat de l' addition directe (CORRECT), et j'affiche la même chose avec la commande MESSAGE pour exclure un problème avec ITEM_ADD. Le problème est bel et bien lié à l'utilisation de la variable. - Code:
-
' méthode d'addition
dim nombre%(10) ,a% ,l% ,a$(10) ,b$ ,c$ ,b% ,col% ,cumul%,pt% ,nb% data 125735,42572,99233,7846647,86559,46956,124987,38455,155583,28787924 for a%=1 to 10:read nombre%(a%):next a%
width 0,1000:font_size 0,14:font_name 0,"Courier New":height 0,600
list 1:height 1,460:width 1,30:left 1,10 list 2:height 2,460:width 2,30:left 2,40 list 3:height 3,460:width 3,30:left 3,70 list 4:height 4,460:width 4,30:left 4,100 list 5:height 5,460:width 5,30:left 5,130 list 6:height 6,460:width 6,30:left 6,160 list 7:height 7,460:width 7,30:left 7,190 list 8:height 8,460:width 8,30:left 8,220 list 9:height 9,460:width 9,30:left 9,250
edit 11:top 11,470:left 11,10:width 11,30 :text 11,0 edit 12:top 12,470:left 12,40:width 12,30 :text 12,0 edit 13:top 13,470:left 13,70:width 13,30 :text 13,0 edit 14:top 14,470:left 14,100:width 14,30:text 14,0 edit 15:top 15,470:left 15,130:width 15,30:text 15,0 edit 16:top 16,470:left 16,160:width 16,30:text 16,0 edit 17:top 17,470:left 17,190:width 17,30:text 17,0 edit 18:top 18,470:left 18,220:width 18,30:text 18,0 edit 19:top 19,470:left 19,250:width 19,30:text 19,0 alpha 53:left 53,320:top 53,470:caption 53,"total des colonnes"
edit 21:top 21,500:left 21,10:width 21,30 :text 21,0 edit 22:top 22,500:left 22,40:width 22,30 :text 22,0 edit 23:top 23,500:left 23,70:width 23,30 :text 23,0 edit 24:top 24,500:left 24,100:width 24,30:text 24,0 edit 25:top 25,500:left 25,130:width 25,30:text 25,0 edit 26:top 26,500:left 26,160:width 26,30:text 26,0 edit 27:top 27,500:left 27,190:width 27,30:text 27,0 edit 28:top 28,500:left 28,220:width 28,30:text 28,0 edit 29:top 29,500:left 29,250:width 29,30:text 29,0 edit 30:top 30,500:left 30,280:width 30,30:text 30,0 alpha 54:left 54,320:top 54,500:caption 54,"total des retenues"
edit 31:top 31,530:left 31,10:width 31,30 :font_bold 31 edit 32:top 32,530:left 32,40:width 32,30 :font_bold 32 edit 33:top 33,530:left 33,70:width 33,30 :font_bold 33 edit 34:top 34,530:left 34,100:width 34,30:font_bold 34 edit 35:top 35,530:left 35,130:width 35,30:font_bold 35 edit 36:top 36,530:left 36,160:width 36,30:font_bold 36 edit 37:top 37,530:left 37,190:width 37,30:font_bold 37 edit 38:top 38,530:left 38,220:width 38,30:font_bold 38 edit 39:top 39,530:left 39,250:width 39,30:font_bold 39 alpha 55:left 55,320:top 55,530:caption 55,"résultat colonne par colonne" edit 56:hide 56
edit 51:width 51,300:height 51,30:color 51,255,204,50 edit 52:width 52,500:height 52,30:color 52,255,100,100:hide 52
list 50:left 50,650:width 50,30:height 50,200:color 50,204,255,51:hint 50,"ordre de lecture des colonnes memo 100:width 100,250:left 100,700:height 100,300 rem afficher les chiffres des nombres cumul% = 0 for a%=1 to 10 cumul% = cumul% + nombre%(a%) b$=right$("000000000000"+str$(nombre%(a%)),9) for b%=1 to 9 item_add b%,mid$(b$,b%,1):item_add b%,"" next b% b$=right$(" "+str$(nombre%(a%)),9) + right$(" "+str$(cumul%),9) item_add 100,b$ next a% for a%=2 to 9:item_add a%,"":next a% c$="" cumul% = 8566727+nombre%(10) item_add 100,cumul% item_add 100,8566727+nombre%(10) message str$(cumul%)+"=8566727+"+str$(nombre%(10))+chr$(13)+chr$(10)+str$(8566727+nombre%(10))+"=8566727+"+str$(28787924)
rem faire un choix quelconque du calcul des colonnes repeat a%=rnd(9) if instr (c$,str$(a%))=0 and a%>0 then item_add 50,a%:c$=c$+str$(a%) until count(50)=9 or scancode=27
rem effacer les listes qui n'ont que des zéros for a%=9 to 1 step -1: ' les colonnes, on regarde si toutes les lignes sont à zéro l%=0 for b%=1 to count(1) step 2:' ligne if item_read$( a%,b%)<>"0" then l%=l%+1 next b% if l%=0 then exit_for next a%
rem les listes effacées, on les retirent pour le calcul for b%=1 to a% clear b% for a%=1 to count(50) if val(item_read$(50,a%))=b% then item_delete 50,a% :exit_for next a% next b% message "on commence le calcul de l'addition, selon un ordre aléatoire, celui de la liste verte" rem on calcule les colonnes au hazard for col%=1 to count(50) if scancode=27 then exit_for a%=item_read$(50,col%): color a%,255,255,0 left 51,left(a%) :left 52,left(a%) rem on commence cumul%=0: pt%=0 for b%=1 to count(a%)-1 step 2 top 51,b%*21-21:top 52,top(51)+21 nb%=item_read$(a%,b%) text 51,str$(nb%)+" + "+str$(cumul%)+" = "+str$(cumul%+nb%) cumul%=cumul%+nb% if cumul%=>11 then show 52:else:hide 52
if cumul%=>11 text 52,str$(cumul%)+" - 11 = " + str$(cumul%-11)+" on marque un point" cumul%=cumul%-11:pt%=pt%+1:item_delete a%,b%+1:item_insert a%,b%+1,"*" wait 200 end_if repeat:until scancode=0:repeat:until scancode=32 or scancode=27 if scancode=27 then exit_for next b% rem affichage des calculs de la colonne: le résultat et les retenues color a%+10,255,255,0:color a%+20,255,0,0 text a%+10,cumul% text a%+20,pt% wait 1500:color a%+10,255,255,255:color a%+20,255,255,255
color a%,255,255,255
if scancode=27 then exit_for next col% :hide 51 text 52,"":c$="" message "maintenant on fait le calcul final" rem resultat final cumul%=0 :hide 52 : show 51 for a%=9 to 1 step -1 text 51,"" :hide 52 if c$<>"" then text 51,"retenu: "+c$+" + " color a%+10,0,255,0: left 51,left(a%)+30:top 51,470:text 51, text$(51)+text$(a%+10)+" + " repeat:until scancode=0:repeat:until scancode=32 color a%+20,255,255,0:top 51,500:text 51,text$(51)+text$(a%+20)+" + " repeat:until scancode=0:repeat:until scancode=32 color a%+21,255,0,0 :left 51,left(a%)+60
cumul%=cumul%+val(text$(a%+10))+val(text$(a%+20))+val(text$(a%+21)) text 51,text$(51)+ text$(a%+21) + " = " + str$(cumul%) color a%+30,204,204,255
if cumul%<10 text a%+30,cumul%:cumul%=0:c$="" else show 52:left 52,left(51):top 52,top(51)+30 text 56,cumul% b$=right$(text$(56),1):c$=left$(text$(56),len(text$(56))-1) text a%+30,b$:cumul%=val(c$) text 52,"dépassement, on pose:"+b$+" on retient:"+c$ end_if text 56,0 repeat:until scancode=0:repeat:until scancode=32 color a%+10,255,255,255:color a%+20,255,255,255:color a%+21,255,255,255:color a%+30,255,255,255 next a% hide 51:hide 52
' contrôle cumul%=0 for a%=1 to 10 cumul%=cumul%+nombre%(a%) next a% item_add 100,"--------------------" item_add 100,cumul% message "comparez le résultat du bas, et celui qui vient d'être fait dans la liste de droite"+chr$(13)+"A votre avis? quel est le bon résultat? voyez avec vos calculatrice!"
Je pense que les lignes 74 à 77 que j'ai insérées, peuvent aider Jack à trouver le problème. | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Je ne sais plus faire une addition!! Mar 1 Mar 2011 - 20:28 | |
| Bonsoir ! chose particulière, c'est que si le cumul on l'effectue dans un réel, le résultat est correct. et pourtant comme le dis Klaus, sur 4 octets cela rentre sans problème - Code:
-
dim somme ... ' contrôle cumul%=0 for a%=1 to 10 cumul%=cumul%+nombre%(a%) next a% item_add 100,"--------------------" item_add 100,cumul% item_add 100,"--------------------" for a%=1 to 10 somme = somme + nombre%(a%) next a% item_add 100, somme | |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Je ne sais plus faire une addition!! Mar 1 Mar 2011 - 21:11 | |
| Voici le plus petit code qui montre le problème: - Code:
-
dim a% a%=8566727+28787924 print a% : rem incorrect print 8566727+28787924 : rem correct print a% ou item_add 100,a% ou caption 0,str$(a%) donnent le même résultat incorrect. En tout cas, je suis plus qu'abasourdi par ce problème. Je vous tiens au courant. | |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Je ne sais plus faire une addition!! Mer 2 Mar 2011 - 10:35 | |
| Un début d'explication: Dans PANORAMIC, tous les calculs s'effectuent en réel, même les calculs avec des entiers. Ainsi, lorsqu'on affecte dans une variable entière le résultat d'un calcul, on a le maximum de précision. Pour cela, une conversion du résultat en entier est effectué pour affecter un nombre entier dans une variable entière.
Dans la ligne: a%=8566727+28787924 le calcul donne le résultat correct: 37354651, mais avant de ranger ce résultat dans la variable a%, un arrondi est effectué pour obtenir un entier. Dans le cas présent, l'arrondi ne devrait rien changer car le résultat est déjà un entier. Et pourtant cet arrondi retourne la valeur 37354652. Par conséquent, la valeur affectée à la variable a% est fausse.
| |
| | | jean_debord
Nombre de messages : 1266 Age : 70 Localisation : Limoges Date d'inscription : 21/09/2008
| Sujet: Re: Je ne sais plus faire une addition!! Mer 2 Mar 2011 - 11:25 | |
| Avec le programme suivant, l'erreur se produit lorsqu'on dépasse 2^30 : - Code:
-
dim i%, a%, x i% = 0 a% = 1 x = 1 for i% = 1 to 31 a% = a% * 2 x = x * 2 print "2^", i%, " = ", a%, " = ", x next i%
C'est assez logique pour des entiers codés sur 32 bits : la limite théorique est 2^31 - 1 | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Je ne sais plus faire une addition!! Mer 2 Mar 2011 - 17:44 | |
| Ah, Jack, là, je suis surpris. J'avais pris l'habitude d'utiliser systématiquement des variables x% si je sais que les valeurs ne peuvent être qu'entières, pensant qu'ainsi, les calculs seraient plus rapides et optimisés. Maintenant, si tu dis que les calculs de font de toute manière en flottant, tout ce raisonnement est faux, et je ferais mieux de tout passer en réel. Tu montres clairement que le calcul en lui-même est correct. C'est l'affectation à un entier qui pose problème. Cela ne peut pas être dû à un arrondi puisqu'il n'y a pas de décimales. Cela ne peut être causé que par la conversion. La preuve: si l'on affecte dans une variable flottante, le résultat est bon: - Code:
-
dim a%, a a%=8566727+28787924 a=8566727+28787924 print a% : rem incorrect print 8566727+28787924 : rem correct print a : rem correct (j'ai élargi ton code, Jack) | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Je ne sais plus faire une addition!! Jeu 3 Mar 2011 - 10:23 | |
| Tiens, finalement c'est tout bête mais je n'avais même pas pensé à ça pour arrondir un nombre à l'entier le plus proche (équivalent du CINT en QBasic): - Code:
-
DIM a, x%
a = 3.1416 x% = a print x%: ' -> 3 arrondi à l'entier inférieur a = 3.51232 x% = a print x%: ' -> 4 arrondi à l'entier supérieur | |
| | | Invité Invité
| Sujet: Re: Je ne sais plus faire une addition!! Jeu 3 Mar 2011 - 10:39 | |
| Oui c'est tout bête. J'ai remarqué une chose, cela ne peut pas être des arrondis. J'ai refait une liste de nombre, et pris individuellement par ligne, le résultat donne des écarts pas toujours de +1 - Code:
-
dim nombre%(10) ,a% ,cumul% data 1257935,9424572,8799233,78466471,8556559,46123956,12495487,3845599,15558347,287879248 memo 1 :full_space 1:font_size 1,14
for a%=1 to 10 read nombre%(a%) :cumul%=cumul%+nombre%(a%) item_add 1,str$(nombre%(a%)) +" -- "+str$(cumul%) next a% ce qui donne: - Citation :
1257935 -- 1257935 9424572 -- 10682507 bon 8799233 -- 19481740 bon 78466472 -- 97948208 résultat: 97948212 soit +4 8556559 -- 106504768 résultat: 106504767 soit -1 46123956 -- 152628720 résultat: 152628724 soit -4 12495487 -- 165124208 résultat: 165124207 soit +1 3845599 -- 168969808 résultat: 168969807 soit +1 15558347 -- 184528160 résultat: 184528155 soit +5 287879232 -- 472407392 bon |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Je ne sais plus faire une addition!! Jeu 3 Mar 2011 - 14:32 | |
| C'est très curieux. Voici un tableau avec les précisions des types de variables DELPHI: - Citation :
- Type Storage size Range
Byte 1 0 to 255 ShortInt 1 -127 to 127 Word 2 0 to 65,535 SmallInt 2 -32,768 to 32,767 LongWord 4 0 to 4,294,967,295 Cardinal 4* 0 to 4,294,967,295 LongInt 4 -2,147,483,648 to 2,147,483,647 Integer 4* -2,147,483,648 to 2,147,483,647 Int64 8 -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 Single 4 7 significant digits, exponent -38 to +38 Currency 8 50+ significant digits, fixed 4 decimal places Double 8 15 significant digits, exponent -308 to +308 Extended 10 19 significant digits, exponent -4932 to +4932 * Note : the Integer and Cardinal types are both 4 bytes in size at present (Delphi release 7), but are not guaranteed to be this size in the future. All other type sizes are guaranteed.
Jack utilise certainement "Double" pour les flottants, et "LongInt" ou "Integer" pour les entiers. Mais alors, le nombre de chiffres significatifs est largement suffisant pour accepter les nombres des exemples donnés ici, et l'anomalie ne s'explique que par un problème de conversion, pour moi. En tout cas, ça ressemble à un vrai bug. | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Je ne sais plus faire une addition!! Jeu 3 Mar 2011 - 14:41 | |
| Voici un petit test édifiant : - Code:
-
dim reel,entier% list 1 : width 1,200 for reel=0.5 to 10.5 entier%=reel item_add 1,"reel:"+str$(reel)+" -> entier :"+str$(entier%) next reel Notez que l'on obtiens que des chiffres pairs... Pour la petite histoire : Le crash du vol 501 d'Ariane en 1996, qui a coûté quelques 500 millions de dollars : (excusez du peu...) L'origine du problème s'est avérée être une erreur de programmation dans le système de référence inertielle. Plus précisément, un flottant 64 bits donnant la vitesse horizontale de la fusée était converti en entier signé sur 16 bits. Or l'entier obtenu étant plus grand que 32767, le plus grand entier représentable sur 16 bits, la conversion échouait, déclenchant une exception non traitée. Le plus drôle ; si l'on peut dire ; dans cette histoire est que tous les tests logiciels avaient été réussis, mais ils avaient été effectués avec les données d'Ariane 4, fusée moins puissante et donc moins rapide qu'Ariane 5, pour laquelle la vitesse horizontale restait inférieure au maximum de 32767 ! Heureusement que l'on en est pas encore là.... Pour ceux qui veulent un peu de lecture, il y a plein de petites anecdotes: http://hal.inria.fr/docs/00/07/14/77/PDF/RR-5105.pdf - voir implémentation de la fonction rint (page 40) | |
| | | Invité Invité
| Sujet: Re: Je ne sais plus faire une addition!! Jeu 3 Mar 2011 - 17:57 | |
| C'est bien de parler de la fusée Ariane. Tu veux m'envoyer dans le cosmos? - Citation :
- Je ne connais pas la méthode du gâteau (?)
faudra que tu me l'explique un de ces jours...
Donc j'ai tenu parole, et je me suis lancé malgré que je risquais de me faire chambrer. Mais vu ce que j'ai découvert, je ne regrette pas d'avoir fait ce programme. C'est un bug important, et pas facile de s'en rendre compte. Qui prend la peine de tout vérifier avec une calculette? |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Je ne sais plus faire une addition!! Jeu 3 Mar 2011 - 18:29 | |
| Nardo je croyais bien ne plus jamais entendre parler de virgule flottante, et voilà qu'elle revient me hanter... | |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Je ne sais plus faire une addition!! Jeu 3 Mar 2011 - 19:40 | |
| Voila, le bug a été compris et résolu. Je vais sortir une version instantanée avec la correction.
Ce problème était effectivement un problème de conversion. Lorsqu'après un calcul, le résultat est converti en entier par un arrondi pour le mettre dans une variable entière, la procédure de conversion qui était appelée, n'était pas la procédure de la bibliothèque mathématique, mais un homonyme dans la bibliothèque graphique qui sert à transformer une coordonnée dans l'espace 3D (X, Y, Z) en un nombre de pixels pour affichage dans le SCENE3D.
Cette procédure de la bibliothèque graphique qui convertit un réel en entier est ultra-rapide (3 instructions en assembleur) mais la conversion se fait au détriment de la précision: le résultat est approché, car on néglige les fractions de pixel lors de l'affichage d'un objet 3D dans un SCENE3D. (en effet, dans notre exemple, une erreur de conversion de 1 sur 37354651 est négligeable pour un affichage, mais est très important pour un calcul arithmétique).
Ce bug est corrigé mais il m'a fait transpirer car j'ai cherché longtemps ce qui pouvait bien se passer. Je n'en reviens pas que je puisse avoir des fonctions homonymes dans le source et que ce soit accepté à la compilation. Je vais faire la chasse à ce type de situation. Autre chose pour les versions futures: dans les tests qui sont effectués avant la sortie d'une version, je vais ajouter des tests intensifs de calcul arithmétique. Jusqu'à présent, toutes les fonctions étaient testées, mais avec toujours les mêmes valeurs. | |
| | | Yannick
Nombre de messages : 8635 Age : 53 Localisation : Bretagne Date d'inscription : 15/02/2010
| Sujet: re Jeu 3 Mar 2011 - 20:44 | |
| Bravo Jack ! je vais me mettre 2 ou 3 coup de pied au ... pour me donner du courage et replonger dans mon petit programme de tables. | |
| | | Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Je ne sais plus faire une addition!! Jeu 3 Mar 2011 - 23:22 | |
| Je vais plagier Ygeronimi: Bravo, Jack !
A l'évidence, ce n'était pas facile à trouver, et je rends hommage à ta ténacité dans cette situation. Par le passé, tu nous a déjà montré un aperçu de cette qualité, qui se confirme une fois de plus. On ne peut que se féliciter de pouvoir utiliser un produit dont le créateur est à ce point engagé et réactif. | |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Je ne sais plus faire une addition!! Ven 4 Mar 2011 - 10:36 | |
| C'est grace à vous tous qui signalez des bugs que PANORAMIC gagne en qualité à chaque correction d'un bug. | |
| | | Nardo26
Nombre de messages : 2294 Age : 56 Localisation : Valence Date d'inscription : 02/07/2010
| Sujet: Re: Je ne sais plus faire une addition!! Ven 4 Mar 2011 - 12:56 | |
| Bravo Jack ! Surtout que comme tu le dis, parfois il n'est pas évident de trouver là où ça coince... Perso, ça fait un petit moment que je me prend la tête sur un pb d'application bankée sur micro DG128A qui plante méchamment en it SWI (chose qui ne devrait jamais arriver!) alors qu'en pas à pas tout fonctionne à merveille... pas de pb de pile, de sauvegarde/restitution de contexte, reste que le scheduler d'actif avec juste une petite tache pour réarmer le watchdog de tps en tps... bref, une belle mer#$ à débugger... Merci également à cosmos, qui, grâce à sa méthode "gateau" a soulevé ce problème !!! @JL35: attention ! ils flottent tous en bas.... | |
| | | Jack Admin
Nombre de messages : 2394 Date d'inscription : 28/05/2007
| Sujet: Re: Je ne sais plus faire une addition!! Ven 4 Mar 2011 - 13:43 | |
| Pour les curieux, les lignes "fautives" sont 3 instructions en assembleur qui convertissent un réel en entier: - Code:
-
FLD valeur FISTP DWORD PTR [valeur] MOV EAX, [valeur] FLD empile un réel FISTP dépile et convertit le réel en un entier, mais la précision de la conversion est définie par une configuration des bits 10 et 11 d'un registre de commande du FPU (processeur flottant) Et la précision n'était pas optimale... A la deuxième ligne, "valeur" sert de variable "tampon" pour minimiser le nombre de lignes
Dernière édition par Jack le Ven 4 Mar 2011 - 13:58, édité 2 fois | |
| | | JL35
Nombre de messages : 7112 Localisation : 77 Date d'inscription : 29/11/2007
| Sujet: Re: Je ne sais plus faire une addition!! Ven 4 Mar 2011 - 13:45 | |
| Je joins mes congratulations aux autres, effectivement ça n'avait rien d'évident. | |
| | | Contenu sponsorisé
| Sujet: Re: Je ne sais plus faire une addition!! | |
| |
| | | | Je ne sais plus faire une addition!! | |
|
Sujets similaires | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |