Nos chère BASIC

Tout sur les ordinateurs, liens, infos...Avec un thread par machine. Si la machine n'y est pas , créez le premier post la concernant dans ce forum

Modérateur : Politburo

Répondre
Avatar de l’utilisateur
Ben
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 803
Inscription : 21 août 2016 19:04

Nos chère BASIC

Message par Ben » 11 nov. 2017 13:19

Une petite erreur d'arrondi de nos chères machines.

Code : Tout sélectionner

10 for i=0 to 40 step .2
20 if i=20 then print "egal 20"
30 next i
Ce programme n'affiche rien! Du moins sur les Commodores et le ZX-81 (le TI-99 n'a pas le souci). Ici, c'est assez simple, mais dans un programme, on peut chercher pour trouver l'erreur!

Avatar de l’utilisateur
Ythunder
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3914
Inscription : 09 août 2008 17:46
Localisation : 03

Re: Nos chère BASIC

Message par Ythunder » 11 nov. 2017 13:21

eu au premier abord, à moins que i ne soit jamais égal à 20...
C'est bizarre ton truc
Je suis CHARLIE
Tell me boy, do you have a room, in your heart, for the Computer boom...

Avatar de l’utilisateur
Fabrice Montupet
Administrateur
Administrateur
Messages : 10322
Inscription : 17 mai 2002 11:39
Localisation : Nevers - France

Re: Nos chère BASIC

Message par Fabrice Montupet » 11 nov. 2017 13:31

Ben a écrit :
11 nov. 2017 13:19
Le TI-99 n'a pas le souci
Je confirme :)

Avatar de l’utilisateur
Ben
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 803
Inscription : 21 août 2016 19:04

Re: Nos chère BASIC

Message par Ben » 11 nov. 2017 13:49

C'est la représentation binaire de "I" qui pose soucis. Si on ajoute la ligne

Code : Tout sélectionner

15 print i
On voit des choses particulières sur le Commodore (j'ai testé sur le VIC-20 et le C-128). Par contre, sur le ZX-81. Les valeurs de I ont l'air correctes, mais il n'affiche quand même pas le message.

destroyedlolo
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1461
Inscription : 03 mai 2003 02:24
Localisation : Nonglard (Annecy)
Contact :

Re: Nos chère BASIC

Message par destroyedlolo » 11 nov. 2017 21:15

Je ne veux pas dire, mais c'est toujours valable.
J'ai eu tres récemment le même probleme avec un programme C (mais ca aurait pu être avec n'importe quel langage), due à la representation binaire des flottants ou 2 != 2.00 (je ne sais plus éxactement pour quelle valeur, le 2.00 étant évidemment dans une variable).

Je pense que si je n'avais pas bidouiller sur nos antiquités, je n'aurai jamais trouvé :twisted: :twisted:
Il y a quand même moins de pb en BCD je trouve ...
Amiga, UNIX
Sharp, NetBSD http://destroyedlolo.info/
Apache, PHP 100 % dictionnary free
Vacances, Voyages 1 mispelling by word

Avatar de l’utilisateur
Nico06
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 487
Inscription : 11 oct. 2002 12:13
Localisation : Cannes
Contact :

Re: Nos chère BASIC

Message par Nico06 » 12 nov. 2017 15:04

Le Sanyo PHC-25 plante gentillement :) mais pas de façon linéaire ?

Code : Tout sélectionner

 0
 .2
 .4
 .6
 .8
 1
 1.2
 1.4
 1.6
 1.8
 2
 2.2
 2.4
 2.6
 2.8
 3
 3.2
 3.40000001
 3.60000001
 3.80000001
 4
 4.2
 4.4
 4.6
 4.8
 5
 5.2
 5.4
 5.6
 5.8
 6
 6.2
 6.39999999
 6.59999999
 6.79999999
 6.99999999
 7.19999999
 7.39999999
 7.59999999
 7.79999999
 7.99999999
 8.19999999
 8.39999999
 8.59999999
 8.79999999
 8.99999999
 9.19999999
 9.39999999
 9.59999999
 9.79999999
 9.99999999
 10.2
 10.4
 10.6
 10.8
 11
 11.2
 11.4
 11.6
 11.8
 12
 12.2
 12.4
 12.6
 12.8
 13
 13.2
 13.4
 13.6
 13.8
 14
 14.2
 14.4
 14.6
 14.8
 15
 15.2
 15.4
 15.6
 15.8
 16
 16.2
 16.4
 16.6
 16.8
 17
 17.2
 17.4
 17.6
 17.8
 18
 18.2
 18.4
 18.6
 18.8
 19
 19.2
 19.4
 19.6
 19.8
 20
 20.2
 20.4
 20.6
 20.8
 21
 21.2
 21.4
 21.6
 21.8
 22.0000001
 22.2000001
 22.4000001
 22.6000001
 22.8000001
 23.0000001
 23.2000001
 23.4000001
 23.6000001
 23.8000001
 24.0000001
 24.2000001
 24.4000001
 24.6000001
 24.8000001
 25.0000001
 25.2000001
 25.4000001
 25.6000001
 25.8000001
 26.0000001
 26.2000001
 26.4000001
 26.6000001
 26.8000001
 27.0000001
 27.2000001
 27.4000001
 27.6000001
 27.8000001
 28.0000001
 28.2000002
 28.4000002
 28.6000002
 28.8000002
 29.0000002
 29.2000002
 29.4000002
 29.6000002
 29.8000002
 30.0000002
 30.2000002
 30.4000002
 30.6000002
 30.8000002
 31.0000002
 31.2000002
 31.4000002
 31.6000002
 31.8000002
 32.0000002
 32.2000002
 32.4000002
 32.6000002
 32.8000002
 33.0000002
 33.2000002
 33.4000002
 33.6000002
 33.8000002
 34.0000002
 34.2000002
 34.4000002
 34.6000003
 34.8000003
 35.0000003
 35.2000003
 35.4000003
 35.6000003
 35.8000003
 36.0000003
 36.2000003
 36.4000003
 36.6000003
 36.8000003
 37.0000003
 37.2000003
 37.4000003
 37.6000003
 37.8000003
 38.0000003
 38.2000003
 38.4000003
 38.6000003
 38.8000003
 39.0000003
 39.2000003
 39.4000003
 39.6000003
 39.8000003
Y a des matins de brocante, on ferait mieux de rester couché - Confucius

Avatar de l’utilisateur
rogeroge
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2693
Inscription : 14 mai 2010 21:41
Localisation : Entre Nancy et Bercy : à Torcy

Re: Nos chère BASIC

Message par rogeroge » 12 nov. 2017 17:39

Bonjour,
Avec PC-BASIC qui simule le GW-BASIC avec les PC modernes, le programme ne fonctionne pas.

Voici une proposition avec modifications qui donne un résultat :
La variable A rendu propre remplace la variable I du compteur qui contient des dispersions faussant le résultat.

Code : Tout sélectionner

10 FOR I=0 TO 40 STEP .2
12 A=INT(I*100)/100
20 IF A=20 THEN PRINT "EGAL 20"
30 NEXT I
run 
EGAL 20
Ok
Il faut être fou pour venir sur ce site mais encore plus fou pour ne pas y revenir !

jxano
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2212
Inscription : 17 févr. 2008 00:34
Localisation : Paris 20ème

Re: Nos chère BASIC

Message par jxano » 13 nov. 2017 12:03

Je réécrirais le programme ainsi :

Code : Tout sélectionner

10 FOR I=0 TO 400 STEP 2
12 A=I/10
20 IF A=20 THEN PRINT "EGAL 20"
30 NEXT I
Programmeur abscons.

Avatar de l’utilisateur
Ythunder
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3914
Inscription : 09 août 2008 17:46
Localisation : 03

Re: Nos chère BASIC

Message par Ythunder » 13 nov. 2017 13:40

rogeroge a écrit :
12 nov. 2017 17:39
Bonjour,
Avec PC-BASIC qui simule le GW-BASIC avec les PC modernes, le programme ne fonctionne pas.

Voici une proposition avec modifications qui donne un résultat :
La variable A rendu propre remplace la variable I du compteur qui contient des dispersions faussant le résultat.

Code : Tout sélectionner

10 FOR I=0 TO 40 STEP .2
12 A=INT(I*100)/100
20 IF A=20 THEN PRINT "EGAL 20"
30 NEXT I
run 
EGAL 20
Ok
Ah pas mal, le fait de mettre une autre variable avec calcul de l'entier de i !
Je suis CHARLIE
Tell me boy, do you have a room, in your heart, for the Computer boom...

Avatar de l’utilisateur
kenneth
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 408
Inscription : 22 sept. 2010 13:48
Localisation : France PdD

Re: Nos chère BASIC

Message par kenneth » 13 nov. 2017 13:56

Donc il doit y avoir un résidu de calcul qui n'apparaît pas dans la mantisse.

Avatar de l’utilisateur
rogeroge
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2693
Inscription : 14 mai 2010 21:41
Localisation : Entre Nancy et Bercy : à Torcy

Re: Nos chère BASIC

Message par rogeroge » 13 nov. 2017 14:27

Ce résidu ou dispersion propre à la nature du langage et au fonctionnement de l'électronique doit se corriger
par une programmation, soit insérée dans la machine, soit provoquée par le programmeur.
En simple précision sur un PC, on voit apparaître avec la ligne additionnelle 15 ajoutée au listing de Ben :

Code : Tout sélectionner

15 PRINT I;" ";

Voici un extrait de l'affichage après RUN 
........
17.39999   17.6  17.8   ....
19.6  19.8  20  20.20001  20.40001  .....
Il doit y avoir un petit monde en décimales non affiché après le nombre 20, ce qui explique l'erreur du programme
et la nécessité d'une retouche.
Il faut être fou pour venir sur ce site mais encore plus fou pour ne pas y revenir !

Avatar de l’utilisateur
Ben
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 803
Inscription : 21 août 2016 19:04

Re: Nos chère BASIC

Message par Ben » 13 nov. 2017 14:47

rogeroge a écrit :
13 nov. 2017 14:27
Il doit y avoir un petit monde en décimales non affiché après le nombre 20, ce qui explique l'erreur du programme
et la nécessité d'une retouche.
En fait, c'est sûrement la représentation binaire des décimales qui pose problème. Comme dis destroyedlolo, une représentation en BCD devrait arranger le problème. Sauf que sur les Commodores, je ne vois pas comment imposer la représentation interne.

Avatar de l’utilisateur
rogeroge
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 2693
Inscription : 14 mai 2010 21:41
Localisation : Entre Nancy et Bercy : à Torcy

Re: Nos chère BASIC

Message par rogeroge » 13 nov. 2017 15:29

Tout à fait et le codage BCD existerait sur la plupart des calculatrices et moins des ordinateurs.
J'ai ajouté une ligne 5 en plus de la ligne 15 au listing "Ben" natif.
Cette demande d'affichage des nombres en double précision montre les décimales plantant le programme.
Image
Il faut être fou pour venir sur ce site mais encore plus fou pour ne pas y revenir !

Avatar de l’utilisateur
Ythunder
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3914
Inscription : 09 août 2008 17:46
Localisation : 03

Re: Nos chère BASIC

Message par Ythunder » 13 nov. 2017 15:38

En fait à chaque fois que le pas de 0.2 atteint le prochain nombre entier, il faudrait réinitialiser la valeur décimal à 0.
Je suis CHARLIE
Tell me boy, do you have a room, in your heart, for the Computer boom...

Avatar de l’utilisateur
Ben
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 803
Inscription : 21 août 2016 19:04

Re: Nos chère BASIC

Message par Ben » 13 nov. 2017 16:54

Ou arrondir à la 2e décimale.

Ce qui peut aussi induire en erreur, c'est que l'instruction PRINT arrondi la représentation réelle en mémoire. Par exemple, toujours sur le Commodore:

Code : Tout sélectionner

PRINT 3/5*5
Affiche bien "3". Mais

Code : Tout sélectionner

PRINT 3/5*5=3
Affiche "0", alors que l'équivalence devrait être vérifiée.

Présenté comme ça, ça a l'air trivial, mais dans des programmes conséquents, on peut chercher longtemps l'erreur :-/

Répondre

Revenir vers « Tous les ordinateurs »