Soustraction en BASIC

un pet, un vic, un 64...

Modérateur : Politburo

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

Soustraction en BASIC

Message par Ben » 09 oct. 2016 19:05

Bonjour,

Une petite particularité du BASIC du C128 (j'imagine que le C64 à le même problème). D'après vous, combien font

30.55050-30?

Bête, j'aurais cru à .5505! Ben non, pour le C128, ça fait:

Code : Tout sélectionner

                     commodore basic v7.0 122365 bytes free
                       (c)1986 commodore electronics, ltd.
                             (c)1977 microsoft corp.
                               all rights reserved
print 30.5505-30
 .550499998

ready.
C'est embêtant ce genre d'arrondi à la noix de coco.
Dernière édition par Ben le 17 oct. 2017 09:06, édité 1 fois.

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

Re: Soustraction en BASIC

Message par destroyedlolo » 09 oct. 2016 19:29

Salut,

Malheureusement, c'est toujours le cas même sur nos machines moderne ... comme je l'ai malheureusement expérimenté (https://forums.gentoo.org/viewtopic-p-7 ... ight-.html)
Amiga, UNIX
Sharp, NetBSD http://destroyedlolo.info/
Apache, PHP 100 % dictionnary free
Vacances, Voyages 1 mispelling by word

Avatar de l’utilisateur
C.Ret
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2021
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Soustraction en BASIC

Message par C.Ret » 09 oct. 2016 19:58

Eh oui , c'est lié à la représentation en binaire des nombres à virgule flottante.

Mias bon, en fait 0.550499998 n'est pas très éloigné de 0.55050 !

Le C128 offre d'ailleurs une méthode interessante pour fournir le résultat attendu :
Image
PRINT USING "###.#####"; 30.55050-30 affiche le "bon" résultat arrondi comme attendu.

Comme quoi il faut être rigoureux en informatique, et ne pas croire que saisir cinq décimales suffit à spécifier à la machine la précision à laquelle on souhaite obtenir un résultat.
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803. | TI-57 LCD | TI-74 BasiCalc | TI-92 II | HP-15C | HP-28S + HP82240A | HP-41C + (2 memory + stat + IR) modules. | HP Prime Wireless Graphing Calculator . .Sommaire des M.P.O.. . Sommaire du P.C.T.M. .

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

Re: Soustraction en BASIC

Message par kenneth » 09 oct. 2016 20:45

Les calculs produisent des résidus. Hebdogiciel proposait un test à l'époque:
-extraire la racine carrée de deux, puis extraire la racine carrée du résultat, ainsi dix fois de suite.
-on doit trouver 1,000000....et des brouettes.
-multiplier le résultat par lui même, faire ça dix fois de suite.
-on doit retrouver 2.

Les meilleurs machines de l'époque donnent quelque chose comme 1,99998
La plus mauvaise (je ne sais plus laquelle) donne un truc du genre...1,6 ! 8O :D

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

Re: Soustraction en BASIC

Message par Ythunder » 09 oct. 2016 20:49

C.Ret a écrit :Eh oui , c'est lié à la représentation en binaire des nombres à virgule flottante.

Mias bon, en fait 0.550499998 n'est pas très éloigné de 0.55050 !

Le C128 offre d'ailleurs une méthode interessante pour fournir le résultat attendu :
Image
PRINT USING "###.#####"; 30.55050-30 affiche le "bon" résultat arrondi comme attendu.

Comme quoi il faut être rigoureux en informatique, et ne pas croire que saisir cinq décimales suffit à spécifier à la machine la précision à laquelle on souhaite obtenir un résultat.
Ouai, mais ça "triche pas ?". Si je me souviens le print using "###" formatte le résultat, donc utilise on demande au micro d'arrondir..
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 : 11712
Inscription : 17 mai 2002 11:39
Localisation : Nevers - France

Re: Soustraction en BASIC

Message par Fabrice Montupet » 09 oct. 2016 22:06

Bien sûr que l'on triche en utilisant un PRINT USING :)

Cela me rappelle un test que la revue Hebdogiciel avait soumis à plusieurs micro-ordinateurs de l'époque:

Code : Tout sélectionner

10 A=2
20 FOR N=1 TO 20
30 A=SQR(A)
40 NEXT N
50 FOR N=1 TO 20
60 A=A^2
70 NEXT N
80 PRINT A
Le résultat doit donner 2 mais la plupart des appareils se ramassaient pas mal à cause de leur faible précision, sur 8 chiffres. Voici les résultats par modèle:

Code : Tout sélectionner

Texas Instruments TI-99/4A: 1.999999924
Exelvision EXL-100: 1.999999924
Canon X-07: 19999997741097
Canon V20: 1.99999977
Yashica (MSX): 1.99999977
Amstrad 464/6128: 1.999433
Atari 800XL: 1.99765243
Sinclair ZX-81: 2.000446
Sinclair Spectrum: 2.000446
Apple //e: 2.00232917
Apple //c: 2.0023291
Commodore C64: 2.00232917
Oric Atmos: 2.00232917
Commodore Vic-20: 2.00232917
Thomson MO5: 2.00232917
Thomson TO7: 2.16828
Thomson TO7/70: 2.16828
Tandy TRS80: 2.16828
Hector HRX: 2.16927 
Le TI-99/4A s'en sortait beaucoup mieux grâce à sa précision sur 14 chiffres. Le côté pervers de la chose est que cela n'arrangeait pas l'image de lenteur qu'il se coltinait sous TI-Basic ;)
Le résultat obtenu avec l'EXL100 n'est pas surprenant puisque ce dernier à hérité d'une bonne part du code du CC-40 de Texas Instruments qui était déjà une récupération du travail effectué sur le 99/4A.

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

Re: Soustraction en BASIC

Message par Ben » 10 oct. 2016 09:04

Oui, je me souviens très bien de ce test d'hebdogiciel. D'ailleurs, je le teste systématiquement sur chaque nouvelle machine :-)

Par contre, ici, c'est une bête soustraction! Le PRINT USING ne peut fonctionner que pour afficher un résultat. Moi, c'était juste un calcul intermédiaire, du coup, tout le reste est faux, évidemment.
J'ai testé ce calcul sur un TI-99, des calculatrices, PC-1500, PB-100, ... Il n'y a que sur le commodore où j'ai ce "bug"

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

Re: Soustraction en BASIC

Message par Ben » 10 oct. 2016 09:10

Concernant le test d'hebdo, en tout cas, pour les Commodores, on gagne (un peu) en rapidité et en précision en replaçant la ligne 60 par

Code : Tout sélectionner

60 A=A*A
On obtient 2.00041079

Avatar de l’utilisateur
C.Ret
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2021
Inscription : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Soustraction en BASIC

Message par C.Ret » 10 oct. 2016 10:02

Eh oui, il faut tricher avec les Commodore, ils ne sont pas les meilleurs en calcul !

Pour ce qui est des calculs faux à cause d'une blague de ce type , ils faut effectivement faire attention. Et ce n'est pas évident de penser à priori aux erreurs liées à la représentation interne des nombres.
C'est vrai que sur des calculatrices ou des ordinateurs plus orientés calculs et maths, c'est plus facile de rester dans la "zone de précision" que sur les CBM, PET et Commodore 8bits qui sont connus pour rapidement sortir de la "zone de précision", voir même franchement créer des erreurs grossières.

Les fonctions EXP, LOG, SIN, COS et ACS sont particulièrement mauvaises, en plus des soucis liés à la représentation interne des nombres, il y a aussi franchement une limite à leur justesse dès les 3-ième ou 4-ième décimale.

Il faut donc très souvent "réarranger" les formules mathématiques et les algorithmes pour qu'ils fonctionnent correctement sur tout le domaine, là où d'autres engins (même contemporains) ne créaient pas de souci !

Ayant eut un tel Commodore bien avant le bac, je fus un grand utilisateur des LET eps=1E-8 et autres corrections des calculs lorsqu'il fallait appliquer les formules sur mon C128D.
Dernière édition par C.Ret le 10 oct. 2016 12:53, édité 1 fois.
SHARP PC-1211 + CE-121 + CE-122. | VIC 20 Commodore 128D + Printer P-803. | TI-57 LCD | TI-74 BasiCalc | TI-92 II | HP-15C | HP-28S + HP82240A | HP-41C + (2 memory + stat + IR) modules. | HP Prime Wireless Graphing Calculator . .Sommaire des M.P.O.. . Sommaire du P.C.T.M. .

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

Re: Soustraction en BASIC

Message par Ben » 10 oct. 2016 10:08

Ces erreurs de calculs sont propres à Commodore? Les Amstrad, Oric & Co ont aussi ce genre de souci?

Je n'ai fait le test que sur un TI-99, lui, il n'a pas le souci (sur la soustraction en tout cas)

Avatar de l’utilisateur
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3700
Inscription : 06 sept. 2011 14:57
Localisation : Normandie / Antwerpen

Re: Soustraction en BASIC

Message par Hobiecat » 10 oct. 2016 10:29

Il y a ce genre d'erreur sur toutes les machines en fait : c'est toujours un compromis entre la place prise en mémoire, la formule de calcul utilisée et l'erreur acceptable. Suivant ce qui est privilégié, il en résulte plus ou moins d'erreur. Pour les ordinateurs des années 80 destinés surtout à "s'amuser", la place en ROM devait être le paramètre principal. ;)

Avatar de l’utilisateur
phm
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 829
Inscription : 08 avr. 2016 18:36
Localisation : Est Parisien

Re: Soustraction en BASIC

Message par phm » 10 oct. 2016 18:18

Hobiecat a écrit :Il y a ce genre d'erreur sur toutes les machines en fait : c'est toujours un compromis entre la place prise en mémoire, la formule de calcul utilisée et l'erreur acceptable. Suivant ce qui est privilégié, il en résulte plus ou moins d'erreur. Pour les ordinateurs des années 80 destinés surtout à "s'amuser", la place en ROM devait être le paramètre principal. ;)
à priori, même aujourd'hui sous SQL server j'ai ce genre de soucis d'arrondi ...
HEWLETT-PACKARD : The best CANON : X-07 X-730 X-711 XM-101 XP-120F XP-140 XP-110F
AMSTRAD : CPC-464 CPC-6128 ATARI : STF DAI Indata
Mais aussi CASIO SHARP TEXAS INSTRUMENTS

Avatar de l’utilisateur
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3700
Inscription : 06 sept. 2011 14:57
Localisation : Normandie / Antwerpen

Re: Soustraction en BASIC

Message par Hobiecat » 10 oct. 2016 19:49

phm a écrit :à priori, même aujourd'hui sous SQL server j'ai ce genre de soucis d'arrondi ...
Il y a sans doute une baisse de qualité globale : je sais que HP, par exemple, faisait bosser des mathématiciens pour parfaire les routines de calcul des premières machines. Sur les langages modernes, cette tâche est sans doute dévolue au "stagiaire informatique" et la qualité s'en ressent.

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

Re: Soustraction en BASIC

Message par Ben » 11 oct. 2016 16:55

Hobiecat a écrit :
phm a écrit :à priori, même aujourd'hui sous SQL server j'ai ce genre de soucis d'arrondi ...
Il y a sans doute une baisse de qualité globale : je sais que HP, par exemple, faisait bosser des mathématiciens pour parfaire les routines de calcul des premières machines. Sur les langages modernes, cette tâche est sans doute dévolue au "stagiaire informatique" et la qualité s'en ressent.
Puis, il y a problème d'arrondi et problème d'arrondi. Je veux bien comprendre que le test d'hebdogiciel provoque des soucis, mais une bête soustraction avec 4 ou 5 chiffres derrières la virgule, c'est autre chose!

Avatar de l’utilisateur
pir2
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4773
Inscription : 31 oct. 2006 16:08
Localisation : 67310 Westhoffen
Contact :

Re: Soustraction en BASIC

Message par pir2 » 11 oct. 2016 17:03

Les langages dédiés aux banques et autre comptas étaient bien précis (ex. COBOL).

En SQL, comme dans les plus anciens FORTRAN ou les plus modernes Java et C#, il suffit de bien typer les données et d'utiliser les bonnes librairies pour ne pas avoir ce genre de soucis.
Image
Image

Répondre

Revenir vers « Commodore 8bits »