Cerca

modulo attività

modulo tecnica

Login Form

esperimenti

In questo articolo si illustrano i risultati di ulteriori esperimenti eseguiti con Scratch per sondarne alcune caratteristiche di velocità in aggiunta a quelli esaminati qui link1.

Viene provocata una rotazione di 7 gradi più volte e si cerca di misurare il tempo impiegato a compiere tutte le rotazioni richieste (nota 1) utilizzando script differenti.

La rotazione multipla può essere effettuata vantaggiosamente utilizzando i cicli di ripetizione ma si deve ricordare che i comandi di controllo del flusso delle istruzioni hanno una notevole incidenza sui tempi di calcolo per i loro legame con l'aggiornamento della grafica.

Può accadere di chiedersi quanto sia veloce Scratch ad eseguire dei calcoli.velocita scratch

Scratch è un linguaggio interpretato che provvede a tenere aggiornato un output grafico.

La grafica di Scratch deve permettere la rappresentazione di azioni in modo tale da assicurare una sufficiente fluidità dei movimenti da rappresentare.

Per assicurare questo requisito Scratch deve aggiornare il grafico con un ritmo minimo che sia sufficiente ad ingannare il cervello umano per assicurare la sensazione di movimento.

 

Con un piccolo progetto di Scratch link1 si fanno alcuni esperimenti nei quali viene inserita un'operazione da ripetere più volte fino allo scadere del tempo di un secondo. Scaduto il tempo si contano i cicli realizzati e si misura la velocità intesa come numero di cicli che si possono completare in un secondo per effettuare un gruppo di operazioni. (nota 1)

con sprite1 vengono eseguite operazioni ridotte al minimo

[tasto 1]: si avvia l'esempio base con il minimo necessario di operazioni. Si prova la velocità facendo effettuare in ciascun ciclo un semplice calcolo di integrazione di un valore senza modificare la grafica da rappresentare in quanto non si agisce sull'immagine visualizzata: la velocità misurata è dell'ordine delle centinaia di migliaia di cicli eseguiti in un secondo (nota 2).

[tasto 2]: si aggiunge una operazione grafica di rotazione dello sprite; la velocità deve diminuire perchè sono aumentate le operazioni da effettuare in ciascun ciclo. In questo caso si impedisce la visualizzazione dello sprite: la velocità è di alcune molte di migliaia di cicli al secondo, ancora tanti ma meno di prima.

[tasto 3]: come il caso precedente ma si consente la visualizzazione della grafica che mostra lo sprite in rotazione: la velocità si attesta sui valori di 30 e 31 cicli al secondo.

 

con sprite2 vengono eseguiti calcoli che utilizzano numerose funzioni trascendenti.

[tasto 4]: non viene modificata alcuna grafica in quanto lo sprite viene nascosto. La velocità ne risulta fortemente diminuita rispetto ai casi precedenti ma ancora elevata trattandosi di circa 100.000 - 200.000 cicli al secondo.

[tasto 5]: viene introdotta una modifica della grafica ma senza la sua visualizzazione: la velocità diminuisce, come ci si poteva aspettare dato che il ciclo comprende una ulteriore operazione, ma rimane elevata.

[tasto 6]: come il caso precedente ma con la visualizzazione della rotazione grafica dello sprite: la velocità si attesta sui valori di 30, 31 cicli al secondo.

 

con sprite3 si introduce l'uso dei blocchi funzione (quelli viola). Dato che la chiamata del blocco viola implica una complicazione del software che deve introdurre una operazione di salto, ci si aspetta un rallentamento ulteriore.

[tasto 7]: i valori di velocità si attestano intorno ai 100.000 cicli al secondo.

[tasto 8]: la presenza di un calcolo di rotazione non mostrato porta la velocità intorno ai 100.000 cicli al secondo.

[tasto 9]: la presenza del movimento dello sprite attesta lla velocità si attesta sui valori di 30, 31 cicli al secondo.

 

Cosa succede se si usa la funzione turbo?velocita tabella

Si prova e si rileva che laddove la grafica viene mostrata e deve essere modificata, la velocità non è più limitata a 30-31 cicli al secondo ed il movimento diventa erratico. 

In particolare ne risulta la tabella di confronto a fianco riprodotta.

NOTA: la tabella riportata è stata rilevata con prove effettuate sulla verione 2 di Scratch. La versione 3 riporta valori più alti ma non cambia la logica insita nei dati raccolti e non ne viene modificato il ragionamento che segue.

 

Si vede che la funzione turbo svolge il proprio compito sospendendo la visualizzazione della grafica per privilegiare il calcolo.

Il disegno della grafica avviene a cadenza regolare che può non corripondere al passaggio da un frame di immagine al successivo compromettendo la comprensibilità della visione.

link1 ad un secondo articolo con altri esperimenti.

Vedi articolo di approfondimento.

 

Conclusioni.

Per ora si può affermare che la grafica rappresenta una potente limitazione alla velocità di esecuzione di calcoli ripetitivi.

La grafica, però, è una delle ragioni che portano a ritenere Scratch essere un potente strumento di simulazione animata.

Il valore di 30 cicli al secondo coincide con la velocità di ripetizione dei quadri video (frame) impostati con FLASH PLAYER che è proprio di 30fps per scelta del team di Scratch, suppongo.

Scratch effettua una modifica dello stage al termine di un ciclo di ripetizione sia esso un "per sempre" o un "ripeti__ volte" o un "ripeti fino a quando__" ... solo non so quale criterio venga utilizzato nel caso ci siano diversi cicli in atto simultaneamente (nota 3).

Se non ci sono cicli, Scratch esegue il rinfresco dello stage 30 volte al secondo.

Se si è in presenza di molti calcoli matematici da effettuare per realizzare delle animazioni complesse è opportuno sospendere l'aggiornamento del quadro da disegnare.

 

Note

nota 1: per queste misurazioni è stato usato Scratch2 offline su un iMac 2,5GHz Intel Core i5 con DDR3 1333MHz. In un progetto online i alori possono essere leggermente diversi.

nota 2: la velocità dipende dal computer utilizzato e da altre operazioni che il suo processore deve effettuare nel frattempo per cui non è nemmeno costante sullo stesso computer. I valori misurati sono stati rilevati utilizzando Scratch 2. Alcuni valori sono sensibilmente inferiori se si lavora in modalità editor.

nota 3: in realtà non c'è nulla di simultaneo in un processo di calcolo, per cui, probabilmente l'affermazione significa che Scratch attende il termine di tutti i blocchi di controllo

 

È possibile simulare il funzionamento di un'altalena utilizzando Scratch.

Fare oscillare un'altalena (vera) è un gioco da bambini.

I bambini più piccoli devono essere spinti dall'esterno, i più grandi imparano a spingersi da soli dall'interno.

Con Scratch è stata realizzata una simulazione:

se si preme [tasto su] quando l'altalena passa per il punto più basso e si preme [tasto giù] quando si trova all'estremità più alta, loscillazione viene amplificata.

Per quale motivo si riesce a fare amplificare l'oscillazione dell'altalena visto che si spinge dall'interno della stessa?

In occasione dell'upgrade della piattaforma di Scratch alla versione 3 tutti i progetti salvati nel sito del MIT nella  versione 2 sono stati riscritti con la nuova versione 3.

Non tutti i progetti ne hanno ricevuto un beneficio in quanto, almeno per ora (marzo 2019) alcune funzioni non svolgono lo stesso lavoro di prima.

Mentre le applicazioni riguardanti narrazioni e storytelling si avvantaggiano di numerose innovazioni sui suoni e sulla grafica e la nuova versione è aperta a numerose estensioni molto interessanti permettendo un rapido interfacciamento con diverse apparecchiature hardware, la parte più collegata alle applicazioni matematico-scientifiche ne viene un po' mortificata o, perlomento, costringe gli autori a rivedere i propri progetti per restituire le funzionalità originali.

Un'applicazione utile allo studio delle proprietà numeriche del computer è quella che riguarda la ricerca del limite del rapporto sin x/x per x che tende a zero utilizzato in questo sito per approssimare numericamente il risultato notevole noto analiticamente.

Mentre la versione 2 al diminuire del valore dell'argomento x porta il limite a 1 senza incertezze, la versione 3 non si comporta allo stesso modo: la versione 3 fornisce il valore 1 per valori di x piccoli ma se si diminuisce x ulteriormente, si osservano valori non più accettabili.

Per scoprire le differenze è stato approntato lo stesso progetto nelle due versioni nelle quali si inserisce un angolo iniziale di 90°, viene quindi calcolato il valore del seno e, infine, il valore del rapporto sinx/x (nota 2).

Premendo il <tasto c>, si divide l'angolo x per 10 e si vede come si modificano i valori, se si tiene anche il <tasto a> premuto la divisione avviene per 10^10.

Quando la divisione per 10 viene ripetuta molte volte si deve vedere l'argomento diminuire a valori molto piccoli senza che vadano perse le cifre significative.

Ogni numero è presentato in formati diversi per poter osservare cosa accade a tutte le cifre significative ed al valore stesso.

Se il valore della variable viene moltiplicato per 10^18 si vedono tutte le sue cifre significative ed anche due di troppo perché la capacità dei registri numerici non supera le 16 cifre significative decimali (vedi link1 ed anche "Abaluth") (nota 3).

In questo modo si possono osservare come i valori si trasformano quando sono divisi per grandi potenze di dieci.

 

Prova con la versione 2 link1

Si prende in considerazione il progetto scritto con la versione 2 

All'inizio i valori sono i seguenti:

x=90, uguale al valore di partenza x0 preimpostato

exp =0 è il valore dell'esponente del moltiplicatore del numero base x0

x*10^18= 90.000.000.000.000.000.000

x valore significativo (nota 1) = 90

sin x= 1 (come ci si aspetta dato che l'argomento è in gradi)

sin x/x = 0,011111

sin x/x modif = 0,63662 (nota 2)

Ovviamente si è lontani dai piccoli angoli per cui non si osserva il valore limite cercato.

 

Premendo <tasto c> si divide per 10 ed i valori cambiano:

x=9,

x*10^18= 9.000.000.000.000.000.000

x valore significativo = 90, deve rimanere così

sin x= 0,156434

sin x/x = 0,017382

sin x/x modif = 0,995893

Si vede già che il rapporto "sin x/x modif" si sta avvicinando a 1

 

Alla quarta iterazione, con angolo di 0.09°, il rapporto "sin x/x modif" vale 1 entro le cifre significative del visore di Scratch2.

La variabile "sin x/x modif *10^18" fa vedere tutte le cifre significative e si vede che non è proprio "1"ma ci va molto vicino.

 

Si può continuare a premere <tasto c> diverse volte per constatare che "sin x/x modif *10^18"si avvicina sempre di più all'unità.

Fino a quando si può continuare?

Alla 26^ iterazione i valori di x e di sin x sono diventati nulli anche guardando tutte le cifre significative ma il rapporto rimane visibile in tutte le cifre sgnificative appena calcolate.

E poi? 

Basta provare aiutandosi con <tasto a> tenuto premuto quando si preme <tasto c> in modo da procedere con esponenti che crescono in valore assoluto di 10 alla volta.

I valori rimangono pressoché invariati fino alla iterazione 308 quando exp = -308.

All'iterazione successiva i valori significativi diventano "infinity" e poco dopo il valore di "sin x/x modif *10^18" comincia a subire variazioni sui valori decimali più piccoli: siamo arrivati alla capacità massima di Scratch di manipolare numeri molto piccoli, meno di così non ce la fa.

Siamo entrati nel campo delle convenzioni su come trattare i numeri macchina.

 

Prova con la versione 3 

La stessa procedura si può condurre con la versione 3.

Già alla prima iterazioni si vede che sin x ha molte meno cifre significative: 9 contro le 17 della versione 2.

Alla terza iterazione, il valore di "sin x/x modif" vale 1 sul visore ... bene!

Alla quinta iterazione diventa maggiore di 1 seppur di poco, poi diventa erratico ed alla 11^ iterazione diventa nullo, come nullo è diventato il valore di sin x.

La versione 3 non calcola il seno con un numero molto grande di cifre significative, non è un problema nemmeno per gli esperimenti scientifici, resta un problema solo per questa dimostrazione.

Alla 27^ iterazione anche il valore di x scompare. 

Per ora mi limito a sospettare che con Scratch 3 i numeri siano trattati in precisione singola a 32 bit che prevede 6-7 cifre per la mantissa (meglio denominata " significant").

 

Note

nota 1: il valore significativo serve per fare vedere come variano le cifre significative mentre il valore diminuisce per effetto della diminuzione della parte esponenziale. Il valore 90 deve rimanere costante perchè quella è la parte significativa impostata all'inizio. Dopo qualche passo, quando l'angolo scende sotto il grado, anche la parte significativa del seno deve rimanere costante.

nota 2: il rapproto sin x/x per angoli misurati in gradi tende a 0,017543 per x che tende a zero in quanto il denominatore della frazione è un numero espresso in gradi. Nell'esperimento è anche stata inserita la variabile "sin x/x modif" che sana il suddetto problema moltiplicando il denominatore per pi.greco()/180 in modo che l'angolo sia espresso in radianti; l'operazione equivale a moltiplicare il risultato per 180 e dividerlo per pi.greco():

\[sin(x)/x =0,017453*\frac{180}{\pi}=1\]

nota 3: di fatto si legge il contenuto della mantissa.