MPO n° 97 Spécial 10e Anniversaire : Précision arithmétique

Ici, on fait dans le petit, le LCD qui déchire sa race, on y cause même calculatrices quand on est en manque !

Modérateur : Politburo

Répondre
Avatar du membre
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6172
Enregistré le : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

MPO n° 97 Spécial 10e Anniversaire : Précision arithmétique

Message par Marge »

calc_mpo.jpg
calc_mpo.jpg (47.46 Kio) Vu 13055 fois
Dessin d'après G. Mathieu.



Il y a dix ans, le 16 octobre 2010, fut lancé le premier Misez P'tit, OP'timisez ! de l'histoire du forum Silicium. (*)

Il y a dix ans, quelques-uns souhaitèrent ressusciter une rubrique qui avait constitué pour beaucoup les bonnes pages de la revue l'Ordinateur de Poche dans les années 80 : comment éviter le gaspillage d'octets dans une machine aux capacités limitées ? - À la vérité, cette rubrique était apparue avec le numéro 15 des mois de juillet et août 1983, soit peu avant la funeste disparition du fameux magazine.

Il y a dix ans, charognard, Woodstock, zpalm, Marcus - et d'autres qui s'investissent encore aujourd'hui - commençaient à faire preuve d'une belle habileté pour résoudre des difficultés exigeant les astuces les plus folles !

Pour fêter l'événement, quoi de plus naturel qu'un tout petit concours utile à nos engins, un Misez P'tit, OP'timisez ! qui permettra à tous de mesurer les capacités de sa ou ses machines et de se dégourdir les neurones ?

C'est ce que je vous propose à partir d'un petit bout de code emprunté à un précurseur du calcul astronomique sur ordinateur (de poche) personnel : Jean Meeus. Né en 1928, ce Belge contemporain (en ses très jeunes années) du « père du Big Bang » Georges Lemaître devenait membre de la Société Astronomique de France à l'âge de 19 ans ; spécialiste en mécanique céleste, il proposait dès novembre 1978 un ouvrage encore en usage aujourd'hui dans lequel il fournissait aux amateurs de nombreuses formules de calculs astronomiques. En introduction, Jean Meeus avertissait le lecteur de la difficulté d'obtenir des résultats fiables étant donné le manque de précision de certains engins. Entre autres vérifications, l'astronome préconisait l'utilisation d'un bref programme en BASIC dont voici la présentation en anglais :


MPO10ansMEEUS.png
MPO10ansMEEUS.png (80.99 Kio) Vu 13055 fois

Pour découvrir avec quelle précision interne un langage informatique fonctionne, on peut utiliser le court programme suivant (en BASIC) :
[Le programme]
Ici, J représente le nombre de bits significatifs de la mantisse pour un nombre en virgule flottante quand 0,30103*J représente le nombre de chiffres significatifs dans un nombre décimal. La constante 0,30103 est - approximativement - le logarithme décimal de 2. Par exemple, l'ordinateur HP-85 donne J = 39, d'où la précision arithmétique de 11,7 chiffres. Avec l'HP-UX Technical BASIC fonctionnant sur l'HP Integral PC (ou HP 9807 A), on obtient J = 52, d'où l'on tire la précision de 15,6 chiffres. Le QuickBASIC 4.5, quant à lui, donne J = 63, d'où une précision de 19,0 chiffres.


Pour les machines utilisant le BASIC, le jeu sera assez succinct, encore que nous ne sommes jamais à l'abri de bonnes surprises... mais l'utilisation du programme permettra au moins de connaître leur précision arithmétique ; pour les autres (Commodore, Novus, Sinclair, Litronix, HP, TI, Casio, SHARP, Elektronika, Psion, Canon, Canola et j'en passe) il vous faudra transformer le code ci-dessus pour obtenir un résultat fiable, proposer votre programme le plus léger possible et donner le nombre auquel vous aboutissez - avant que ce Misez P'tit : OP'timisez ! ne se transforme en Pot Commun Pour Toutes Les Machines. Et si votre machine n'est pas programmable, rien ne vous empêche d'effectuer les opérations manuellement !

Par exemple, le Turbo Pascal 5.0 sur HP 200-LX, pour les variables réelles, donne J = 39, soit une précision de 11,74 chiffres (autant que le HP-85) en 291 octets (on doit pouvoir faire beaucoup mieux !) - et il me reste à tester d'autres variables.

Un bilan sera proposé sous forme de classement avant le prochain (bon) anniversaire de MPO !!!!!!!!!!
- et longue vie à J. Meeus !

(*) Oui, chez moi on fête les anniversaires la veille. :D
Modifié en dernier par Marge le 17 oct. 2020 19:58, modifié 2 fois.
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
remy
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2218
Enregistré le : 13 mars 2006 15:39
Localisation : Issy
Contact :

Re: MPO 96 Spécial 10e Anniversaire : Précision arithmétique

Message par remy »

pc1475.jpg
pc1475.jpg (80.11 Kio) Vu 13044 fois
PockEmul, Emulateur de pocket Sharp, Canon, Casio, HP, TI, NEC, Panasonic, Sanco, Seiko, General, National, ....
sur Windows, Linux, OS X et Android
Available now on the Google Play Store and the Apple Store
Avatar du membre
ledudu
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5635
Enregistré le : 26 mars 2009 13:07
Localisation : Ile de France
Contact :

Re: MPO 96 Spécial 10e Anniversaire : Précision arithmétique

Message par ledudu »

Excellent, j'adore célébrer les anniversaires.

En revanche, tu as dû oublier que le MPO n°0 a été réintroduit tardivement dans les mpo (par un certain marge).
Le premier MPO est donc le MPO n°1 écrit par Hobiecat le 6 Octobre 2011.
Avatar du membre
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6172
Enregistré le : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: MPO 96 Spécial 10e Anniversaire : Précision arithmétique

Message par Marge »

ledudu a écrit : 15 oct. 2020 22:28 Excellent, j'adore célébrer les anniversaires.

En revanche, tu as dû oublier que le MPO n°0 a été réintroduit tardivement dans les mpo (par un certain marge).
Le premier MPO est donc le MPO n°1 écrit par Hobiecat le 6 Octobre 2011.
Si tu veux fêter le dixième anniversaire du MPO n°1, c'est d'accord. Tu prépares un gâteau ? Tu as du temps, là.
Le MPO n°0 date bien du 16 octobre 2010. Mais si on considère que ce n'est pas un MPO, pas de problème, je supprime ce fil.
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
Avatar du membre
ledudu
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5635
Enregistré le : 26 mars 2009 13:07
Localisation : Ile de France
Contact :

Re: MPO 96 Spécial 10e Anniversaire : Précision arithmétique

Message par ledudu »

Rhaaaa !! Je plaisante ! :D :D :D

Mais oui, vive le numéro 0 ! :mrgreen:
Avatar du membre
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6172
Enregistré le : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: MPO 96 Spécial 10e Anniversaire : Précision arithmétique

Message par Marge »

Bon, pour montrer l'exemple, voici mon premier programme pour Turbo Pascal 5.5 sur le HP 200-LX. On ne rit pas !

Image

Code : Tout sélectionner

Program PrecArit;
Label
	1,2,3;
Var
	X,J	: real;
Begin
	X := 1;
	J := 0;
1
  :	X := X * 2;
	If (X+1) <> X Then Goto 2;
	Goto 3;
2  
  :	J := J + 1;
  	Goto 1;
3
  :	Write('J= ',J);
  	Write('   Précision décimale : ',J * 0.30103)
End.  	
Ne me demandez pas pourquoi les deux points à la ligne après le label fonctionnent ainsi : j'ai simplement suivi l'aide du débogueur assez bien faite qui m'a signalé ce qui manquait...

J= 3.9000000000E+01 Précision décimale : 1.1740170000E+01
PRECARIT.PAS 292 octets
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
Avatar du membre
Marge
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 6172
Enregistré le : 01 oct. 2008 14:39
Localisation : En bas, tout au fond à gauche.

Re: MPO 96 Spécial 10e Anniversaire : Précision arithmétique

Message par Marge »

Toujours sur le HP 200LX, avec le même programme et les variables déclarées en mode Extended et l'émulation du coprocesseur 387 :

J= 64 ; Précision décimale : 19,26...
Mais... 296 octets, 4 de plus.

On n'est pas encore au niveau du Sharp de Rémy, mais on s'en approche. :P
3 hommes, 3 demis, un 3a... Magnéto, Serge !

Quelques-uns de mes petits programmes pour machines Hewlett-Packard :
15C : Knight's Tour ;
29C : (k-)Permutations, Combinations, Linear Regression and Pseudo-random number ;
34C : Hanoi Towers - Automatic & Manual resolutions ;
67
__: A L I E N .

« Boris », c'était juste Maurice enrhumé.
Avatar du membre
ledudu
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5635
Enregistré le : 26 mars 2009 13:07
Localisation : Ile de France
Contact :

Re: MPO 96 Spécial 10e Anniversaire : Précision arithmétique

Message par ledudu »

--------------------------------
Machine : CASIO PRO FX-1
Langage : FORTRAN
Année : 1975
-------------------------------
Version 1 : 73 pas
1=K1:2=K0:
ST#2:1=1 x K2:3=1 + K1:IF 1=3:1:3:1:
ST#1:2=2+K1:GOTO 2:
ST#3:4=2 x K0.30103:
ANS 2:
ANS 4:
-------------------------------
Version 2 : 67 pas
1=K1:2=K0:
ST#2:2=2+K1:1=1 x K2:3=1 + K1:IF 1=3:2:3:2:
ST#3:4=2 x K.30103:
ANS 2:
ANS 4:
-------------------------------
Version 3 : 63 pas
1=K1:2=K0:
ST#2:2=2+K1:1=1 x K2:3=1 + K1:IF 1=3:2:3:2:
ST#3:4=K2LOG x 2:
ANS 2:
ANS 4:
------------------------------
J=36
Prec:10.83708
Modifié en dernier par ledudu le 17 oct. 2020 10:25, modifié 9 fois.
remy
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 2218
Enregistré le : 13 mars 2006 15:39
Localisation : Issy
Contact :

Re: MPO 96 Spécial 10e Anniversaire : Précision arithmétique

Message par remy »

Allez une autre encore plus forte. Le National JR-800
jr800.jpg
jr800.jpg (88.7 Kio) Vu 12947 fois
PockEmul, Emulateur de pocket Sharp, Canon, Casio, HP, TI, NEC, Panasonic, Sanco, Seiko, General, National, ....
sur Windows, Linux, OS X et Android
Available now on the Google Play Store and the Apple Store
Avatar du membre
bernouilli92
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5230
Enregistré le : 21 nov. 2012 13:03
Localisation : Ile de France

Re: MPO 96 Spécial 10e Anniversaire : Précision arithmétique

Message par bernouilli92 »

Hp48 :

Code : Tout sélectionner

« -1 1
  DO 
    2 * SWAP 1 + SWAP
  UNTIL 
    DUP DUP 1 + ==
  END 
  DROP DUP 2 LOG *
»
Taille : 62,5 octets

Résultat : 39 - 11,74017
HP, Casio, Sharp, Psion, quelques TI et divers autres
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: MPO 96 Spécial 10e Anniversaire : Précision arithmétique

Message par Gilles59 »

bernouilli92 a écrit : 17 oct. 2020 08:22 Hp48 :

Code : Tout sélectionner

« -1 1
  DO 
    2 * SWAP 1 + SWAP
  UNTIL 
    DUP DUP 1 + ==
  END 
  DROP DUP 2 LOG *
»
Taille : 62,5 octets

Résultat : 39 - 11,74017
Le même code (à part un DUPDUP au lieu de DUP DUP) en NewRPL sur ma HP50 donne :

Par défaut (32 chiffres significatifs) : 106 - 31,9
Après un 200 SETPREC : 664 - 199,88
Après un 2000 SETPREC 6643 - 1999,74 (en 3,3sec)

Taille : 88 octets (un prog newRPL et toujours un peu plus long mais comme on a 420ko de ram dispo ;D )

Le newRPL est nativement multiprécision. Il suffit de choisir la précision souhaitée avec la commande SETPREC...
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: MPO 96 Spécial 10e Anniversaire : Précision arithmétique

Message par Gilles59 »

sur Casio FX602P

Code : Tout sélectionner

 1 Min01 0 Min02 
LBL3
 MR01 x 2 = Min01 + 1 - MR01 = x=0 GOTO8
 1 M+02 GOTO3
LBL8
 MR02 HLT
 MR02 x .30103 =
-> 36 - 10.837

A noter que la 602P utilise un systeme d'arrondi interne qui fait que par exemple 2 √ √ ² ² donne exactement 2 ou que 1 / 3 * 3 donne exactement 3 (Le NewRPL même avec 2000 chiffres signifcatifs arrondi à 1 a l'affichage mais trouve en fait 0.999999....999

Le système de 602P est bien pratique pour certains calculs mais en fait ça n'améliore en rien la précision au contraire ouisqu'elle est donnée pour 12 chiffres significatifs. Le bidouillage interne du 12ieme chiffres passe la précision à 11 environ. Ca juste plus précis dans des cas très particuliers ;D
Modifié en dernier par Gilles59 le 17 oct. 2020 11:53, modifié 1 fois.
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
Avatar du membre
ledudu
Fonctionne à 14400 bauds
Fonctionne à 14400 bauds
Messages : 5635
Enregistré le : 26 mars 2009 13:07
Localisation : Ile de France
Contact :

Re: MPO 96 Spécial 10e Anniversaire : Précision arithmétique

Message par ledudu »

Salut Gilles,
Super la 602p.
En revanche, on est sur un MPO. Je pense qu'il y a encore quelques octets à gagner... :D
J'attends ta V2 avant de m'y attaquer...
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: MPO 96 Spécial 10e Anniversaire : Précision arithmétique

Message par Gilles59 »

ledudu a écrit : 17 oct. 2020 11:45 Salut Gilles,
Super la 602p.
En revanche, on est sur un MPO. Je pense qu'il y a encore quelques octets à gagner... :D
J'attends ta V2 avant de m'y attaquer...
oui... la j'ai fait un quasi copier-collé du Basic comme le montre les LBL ;D ....

La v2 (25 pas). curieusement plus précise (1 boucle en plus ou bien il y a un bug? Je soupçonne que la commande = que je supprime une fois ici fait le tripatouillage d'arrondi que j'évoque au dessus. En supprimant le = ce serait un peu plus précis?) :

Code : Tout sélectionner

1 Min01 0 Min00
LBL3
 MR01 x 2  + Min01 1 - MR01 = x=0 GOTO8
 ISZ GOTO3
LBL8
 MR00 HALT
  x 2 log =
37 - 11.138

EDIT : j'ai une version 23 pas (sans compter le pas du programme P0 ou autre), mais je vous laisse chercher ;D
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
Gilles59
Fonctionne à 2400 bauds
Fonctionne à 2400 bauds
Messages : 1602
Enregistré le : 27 oct. 2010 20:46

Re: MPO 96 Spécial 10e Anniversaire : Précision arithmétique

Message par Gilles59 »

ledudu a écrit : 17 oct. 2020 11:45 Salut Gilles,
Super la 602p.
En revanche, on est sur un MPO. Je pense qu'il y a encore quelques octets à gagner... :D
J'attends ta V2 avant de m'y attaquer...
As tu remarqué que mon premier programme 602P donne exactement le même résultat que le tien avec la Casio PRO FX-1?
Sur la pro FX-1 "1 / 3 * 3 - 1 =" donne quoi? Je ne serai pas surpris que la 602p hérite de Pro FX-1 du curieux système d'arrondi.
Casio FX-502P /602P / 603P / FX180P+ / FX4000P / TI57 / TI66 / TI74 Basicalc / TI95 Procalc / HP12C / HP15C LE / DM41L / HP 30B / HP39GII / HP 48SX USA / 49G / 49g+ / 50G / 50G NewRPL / HP Prime / Oric 1 / Amstrad CPC 6128+ CM14 et MM12 / Alice 32
Répondre

Retourner vers « Tous les Pockets »