Soustraction en BASIC

un pet, un vic, un 64...

Modérateur : Politburo

Ben
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1549
Enregistré le : 21 août 2016 19:04

Soustraction en BASIC

Message par Ben »

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.
Modifié en dernier par Ben le 17 oct. 2017 09:06, modifié 1 fois.
destroyedlolo
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1799
Enregistré le : 03 mai 2003 02:24
Localisation : Nonglard (Annecy)
Contact :

Re: Soustraction en BASIC

Message par destroyedlolo »

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 du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3404
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Soustraction en BASIC

Message par C.Ret »

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 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
kenneth
Fonctionne à 1200 bauds
Fonctionne à 1200 bauds
Messages : 948
Enregistré le : 22 sept. 2010 13:48
Localisation : France PdD

Re: Soustraction en BASIC

Message par kenneth »

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 du membre
Ythunder
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4549
Enregistré le : 09 août 2008 17:46
Localisation : 03

Re: Soustraction en BASIC

Message par Ythunder »

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..
Quand je lis ça "oui des passionnées qui modifie des machines pour en faire des moutons a 5 pattes qui n'ont plus rien a voir avec la machine d'origine afin de faire la video choc sur youtube..."

Ca me fait rire. Perso, je n'ai ni chaine youtube sur les machines et je n'ai aucun mouton à 5 pattes qui n'a pàlus rien a voir avec des machines d'origine. Mais à qui s'adressait on ?
Avatar du membre
Fabrice Montupet
Administrateur
Administrateur
Messages : 11083
Enregistré le : 17 mai 2002 11:39
Localisation : Nevers - France

Re: Soustraction en BASIC

Message par Fabrice Montupet »

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.
Ben
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1549
Enregistré le : 21 août 2016 19:04

Re: Soustraction en BASIC

Message par Ben »

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"
Ben
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1549
Enregistré le : 21 août 2016 19:04

Re: Soustraction en BASIC

Message par Ben »

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 du membre
C.Ret
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3404
Enregistré le : 31 mai 2008 23:43
Localisation : N 49°22 E 6°10

Re: Soustraction en BASIC

Message par C.Ret »

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.
Modifié en dernier par C.Ret le 10 oct. 2016 12:53, modifié 1 fois.
SHARP PC-1211 PC-1360 EL-5150 PC-E500 | Commodore C=128D | Texas Instruments Ti-57LCD Ti-74BASICalc Ti-92II Ti-58c Ti-95PROCalc Ti-30XPROMathPrint | Hewlett-Packard HP-28S HP-41C HP-15C HP-Prime HP-71B | CASIO fx-602p | NUMWORKS | Graphoplex Rietz Neperlog | PockEmul | Sommaire des M.P.O. | Ma...dov'il sapone.
Ben
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1549
Enregistré le : 21 août 2016 19:04

Re: Soustraction en BASIC

Message par Ben »

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 du membre
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3626
Enregistré le : 06 sept. 2011 14:57
Localisation : Normandie

Re: Soustraction en BASIC

Message par Hobiecat »

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 du membre
phm
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1361
Enregistré le : 08 avr. 2016 18:36
Localisation : Est Parisien

Re: Soustraction en BASIC

Message par phm »

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 XR-100 XM-101 XP-110F XP-120F XP-130F XP-140

AMSTRAD CPC-464 CPC-6128 ATARI STF DAI Indata
Avatar du membre
Hobiecat
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 3626
Enregistré le : 06 sept. 2011 14:57
Localisation : Normandie

Re: Soustraction en BASIC

Message par Hobiecat »

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.
Ben
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1549
Enregistré le : 21 août 2016 19:04

Re: Soustraction en BASIC

Message par Ben »

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 du membre
pir2
Fonctionne à 9600 bauds
Fonctionne à 9600 bauds
Messages : 4642
Enregistré le : 31 oct. 2006 15:08
Localisation : 67310 Westhoffen
Contact :

Re: Soustraction en BASIC

Message par pir2 »

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

Retourner vers « Commodore 8bits »