Et c'est en testant qu'on se rend compte qu'on fait n'importe quoi !
Le positionnement du contrôle de limite est désormais incorrect et en inversant le contrôle de parité, c'est mieux et plus rapide !
Pour ULAM(77031) j'obtiens Vol : 350 Alt : 21933016 Temps : 13.92
10 S=0 @ A=0 @ INPUT 'Nombre : ';N @ T=TIME
20 IF N=1 THEN 40 ELSE IF MOD(N,2)=0 THEN N=N/2 @ S=S+1 @ GOTO 20
30 IF N>333333333332 THEN 50 ELSE N=(N*3+1)/2 @ S=S+2 @ A=MAX(A,N*2) @ GOTO 20
40 T=TIME-T @ PRINT 'Vol : ';S;' Alt : ';A;' Tps : ';T @ END
50 PRINT 'Depassement capacite'
ULAM(33554431) donne un dépassement de capacité (2^25-1)
ULAM(16777215) --> Vol : 474 Alt : 564859072960 Temps : 19.18 (2^24-1)
Sur le HP 71B tu peux détecter le dépassement de capacité avec le flag INX qui correspond à l'exception "résultat inexact" du standard IEEE 754, par ex:
zpalm a écrit :
Sur le HP 71B tu peux détecter le dépassement de capacité avec le flag INX qui correspond à l'exception "résultat inexact" du standard IEEE 754, par ex:
10 S=0 @ A=0 @ INPUT 'Nombre : ';N @ T=TIME @ CFLAG MATH
20 IF N=1 THEN 40 ELSE IF MOD(N,2)=0 THEN N=N/2 @ S=S+1 @ GOTO 20
30 N=(N*3+1)/2 @ S=S+2 @ A=MAX(A,N) @ IF FLAG(INX) THEN 50 ELSE 20
40 T=TIME-T @ PRINT 'Vol : ';S;' Alt : ';A*2;' Tps : ';T @ END
50 PRINT 'Depassement capacite'
J'ai modifié la fin de la ligne 10 et la ligne 30.
Merci pour l'info : c'est bien le sujet avec cette machine, un langage super performant et donc une nécessité d'avoir une vision globale des possibilités pour pouvoir en tirer le maximum (d'où le sentiment d'être en possibilité permanente d'améliorer les performances du code).
En prenant compte tes modifs (attention à la ligne 30, il faut bien A=MAX(A,N*2)) :
J'obtiens :
ULAM(77031) --> Vol : 350 Alt : 21933016 Temps : 13.83 (un chouilla mieux, mais le test est plus simple)
ULAM(33554431) donne un dépassement de capacité (2^25-1) - Ca marche effectivement au vol 48 (valeur de S lue après fin du programme) où N>5*10^11 après la division par 2.
ULAM(16777215) --> Vol : 474 Alt : 564859072960 Temps : 19.05 (2^24-1)
RetroGeek, mais pas que... HP : 15C, 41CV, 48GX, 71B, 75C Canon X-07 Sharp PC 1403H, PC1500A, PC1600, PC-G850V Texas : CC40, 66, 74, 95, 92 Casio : PB-700, PB-1000, Z-1GR Psion 5mx, mais pas que...
caloubugs a écrit :En prenant compte tes modifs (attention à la ligne 30, il faut bien A=MAX(A,N*2)) :
Pas forcément, on peut déporter la multiplication par 2 à la ligne 40 pour éviter de la faire dans la boucle (ce que j'avais fait sans le dire dans mon exemple...). Sur EMU71 avec l'option "Authentic Calculator Speed" j'obtient 13.03 s pour N=77031.
caloubugs a écrit :En prenant compte tes modifs (attention à la ligne 30, il faut bien A=MAX(A,N*2)) :
Pas forcément, on peut déporter la multiplication par 2 à la ligne 40 pour éviter de la faire dans la boucle (ce que j'avais fait sans le dire dans mon exemple...). Sur EMU71 avec l'option "Authentic Calculator Speed" j'obtient 13.03 s pour N=77031.
Mais oui ! Et en plus on évite 350 fois ce calcul dans la boucle !
Bien vu !
Pour moi : Vol : 350 Alt : 21933016 Temps : 13.17 (sur un Netbook qui rame... Normal).
Ça baisse, ça baisse...
RetroGeek, mais pas que... HP : 15C, 41CV, 48GX, 71B, 75C Canon X-07 Sharp PC 1403H, PC1500A, PC1600, PC-G850V Texas : CC40, 66, 74, 95, 92 Casio : PB-700, PB-1000, Z-1GR Psion 5mx, mais pas que...
zpalm a écrit :Sur EMU71 avec l'option "Authentic Calculator Speed" j'obtient 13.03 s pour N=77031.
caloubugs a écrit :Pour moi : Vol : 350 Alt : 21933016 Temps : 13.17 (sur un Netbook qui rame... Normal).
Sur mon HP 71B: 13.1 s , pile entre les deux émulations.
Impressionnant !
Je serais bien curieux de savoir comment c'est codé dans emu71 pour arriver à un tel réalisme dans l'exécution. J'imagine via des contrôles d'horloge (timers), mais faire tout passer par ça pour garantir ce réalisme, quel boulot !
Ou alors y'a une astuce...
Bravo au concepteur !
RetroGeek, mais pas que... HP : 15C, 41CV, 48GX, 71B, 75C Canon X-07 Sharp PC 1403H, PC1500A, PC1600, PC-G850V Texas : CC40, 66, 74, 95, 92 Casio : PB-700, PB-1000, Z-1GR Psion 5mx, mais pas que...
caloubugs a écrit :Impressionnant !
Je serais bien curieux de savoir comment c'est codé dans emu71 pour arriver à un tel réalisme dans l'exécution. J'imagine via des contrôles d'horloge (timers), mais faire tout passer par ça pour garantir ce réalisme, quel boulot !
Ou alors y'a une astuce...