Cerca

modulo attività

modulo tecnica

Il modo usato da Scratch per rappresentare numeri, valori e stringhe è stato affrontato in una dell appendici dei libri della collana "coding a scuola":

ePubButtonpdfButton04-Valori e variabili. Estratto dal libro "Geometria analitica con Scratch" in cui vengono esposti alcuni aspetti utili per il trattamento di valori numerici, la loro visualizzazione e l'utilizzo delle variabili.

Vengono proposti degli esperimenti con cui approfondire alcune caratteristiche del modo usato da Scratch per trattare i numeri.

Il progetto di Scratch "valori" permette di osservare la capacità di Scratch di manipolare i valori numerici.

L'applicazione si utilizza premendo alcuni tasti per attivare le diverse operazioni messe a disposizione.

Valori

Negli esperimenti seguenti si farà uso di termini simili con un significato che deve essere precisato come segue: 

- valore inserito: è il valore assegnato ad una variabile; ad una variabile può essere assegnata una qualunque sequenza di numeri e/o cifre (valore alfanumerico); appena inserito il valore e prima di qualsiasi operazione viene visualizzato "così come è" nel visore (detto anche monitor) della variabile;

- valore elaborato: è il valore che Scratch inserisce nei suoi registri per effettuare i calcoli richiesti; per saperne di più si fanno effettuare da Scratch semplici operazioni per vedere come viene trattata la sequenza alfanumerica cioé quale possa essere il valore effettivamente utilizzato nei registri di Scratch;

- valore visualizzato: è il valore che viene mostrato sul visore della variabile al termine di ciascuna operazione; si fanno prove e si vede cosa appare sul visore ed anche che cosa potrebbe apparire modificando la posizione della virgola.

Nella prova con [tasto 7] si illustrano bene i tre significati.

Nota: si pensa che Scratch abbia propri registri per memorizzare i valori delle variabili. Come tutti i registri di un computer esiste il problema del limite dello spazio a disposizione della memoria per cui non è possibile memorizzare un numero con un numero qualsiasi di cifre e di dimensione comunque grande. Lo scopo di queste prove consiste proprio nel sondare le capacità di Scratch quando viene portato ai limiti delle sue possibilità di memorizzazione.

 

In un primo gruppo di script vengono effettuate alcune operazioni e si esamina cosa accade sul numero visualizzato dopodiché si sondano le capacità di Scrtach di trattare numeri molto grandi o molto piccoli.

numeri tasto1

Nel primo gruppo viene inserito un valore iniziale nella variabile "x" sul quale si fanno più operazioni di addizione con "1".

l valore iniziale viene assegnato con la prima istruzione, per esempio,

x:= 1234567890

successivamente ne viene modificato il valore 

x:= x+1(nota 1) per due volte

infine si aggiunge 10 con un ciclo

ripeti 10 volte"x:= x+1" (nota 2)

La figura illustra il primo degli script che svolge la funzione appena descritta.

Altri script sono basati sulla stessa struttura ma con piccole variazioni che servono a vedere come si comporta Scratch in alcuni casi paerticolari.

Per procedere di un passo occorre premere [tasto C] così si ha il tempo di osservare cosa succede alla variabile "x". (nota 3)

 

Prova

[tasto 1]: viene inserito in "x" un valore numerico intero di dieci cifre "1234567890". I risultati sono:

"1234567891"

"1234567892"

"1234567902"

Osservazioni.

Si vede che accade quello che si prevede: sul visore appaiono in successione i risultati delle operazioni.

 

Prove con numeri e lettere

Cosa accade se si inserisce una stringa di lettere??

[tasto L]: all'inizio viene inserito in "x" un valore alfabetico "abcd". I risultati sono:

1

2

12

Osservazioni. Poiché si chede un'operazione aritmetica, Scratch ignora le lettere e considera nullo il valore iniziale di "x".

 

Cosa accade con una stringa mista?

[tasto A]: inizialmente viene inserito in "x" un valore alfanumerico "1234a". I risultati sono identici al caso precedente.

Osservazioni.

Poiché si chiede un'operazione aritmetica, Scratch ignora le lettere e numeri e considera nullo il valore iniziale di "x". Lettere e numeri sono considerati come stringa con cui non si fanno aperazioni aritmetiche. (nota4)

 

Cosa accade con "spazio"?

[tasto S]: viene inserito in "x" un valore alfabetico "123 4". I risultati sono identici al caso precedente.

Osservazioni.

Scratch considera lo "spazio" come un carattere alfabetico e non fa trattare il valore come un valore numerico su cui fare operazioni aritmetiche.

 

Una eccezione!

[tasto E]: viene inserito in "x" un valore alfanumerico "1234e". I risultati sono:

1235

1236

1246

Osservazioni.

Con la lettera "e" al termine del numero vengono comunque effettuati i calcoli come se la "e" non ci fosse. In Scratch versione 2, la lettera "e" dopo un numero rappresenta la notazione "scientifica" da usare per inserire un fattore di moltiplicazione in termini di potenze del "10" . Per esempio il numero 1000 è "1e3".

Nel caso della prova non c'è nulla dopo la lettera "e" per cui Scratch considera 0 l'esponente di 10 e di conseguenza:

"x:=12344e" significa che "x" vale 1224*100 quindi 1234*1 = 1234 da cui i valori calcolati.

 

Prove con numeri molto grandi

Quante cifre significative si possono elaborare con Scratch e quante se ne possono vedere?

[tasto 2]: viene inserito in "x" un numero intero di 20 cifre "12345678901234567890". I risultati in successione sono:

12345678901234565000

12345678901234565000

12345678901234565000

Osservazioni.

La cifra delle unità non cambia: aggiungere 1 alla ventesima posizione è irrilevante e si vede che cambia qualcosa solo alla cifra delle migliaia che occupa la diciasettesima posizione da sinistra. Alla prima addizione la diciasettesima cifra diventa 5 e le seguenti sono 0. Con le addizioni successive il risultato non cambia. Si è in una situazione di overflow dove il numero da memorizzare è più grande del valore massimo che la memoria di Scratch può contenere.

 

[tasto 3]: viene inserito in "x" un numero intero di 16 cifre uguali "999999999999999". I risultati sono:

10000000000000000

10000000000000000

10000000000000000

Osservazioni.

La prima addizione manda Scratch in overflow. Le seguenti non cambiano nulla proprio perchè Scratch non è in grado di trattare numeri più grandi.

 

[tasto 4]: viene inserito in "x" un numero intero di 15 cifre uguali "999999999999999". I risultati sono:

1000000000000000

1000000000000001

1000000000000011

Osservazioni.

L'addizione funziona: con un numero di 15 cifre intere Scratch è in grado di fare operazioni.

Se si preme "O" il risultato viene moltiplicato per 10 e con le addizioni successive (+1, +1, +10) si vede che non calcola più correttamente.

  

[tasto 5]: viene inserito in "x" un numero intero di 16 cifre uguali "9999999999999999" ma si effettuano sottrazioni successive. I risultati sono:

10000000000000000

10000000000000000

10000000000000000

Osservazioni.

La prima sottrazione fa aumentare il numero, le successive lo lasciano invariato. Si è troppo vicini all'overflow e non si sa cosa capita ai numeri nel registro di Scratch. 

  

[tasto 6]: viene inserito in "x" un numero intero di 15 cifre uguali "999999999999999" e si effettuano sottrazioni successive. I risultati sono:

999999999999998

999999999999997

999999999999987

Osservazioni.

Le sottrazioni successive sono corrette.

  

Prove con numeri molto piccoli

 

[tasto 7]: viene inserito in "x" un numero  di 20 cifre decimali "0.12345678901234567890" e si effettuano addizioni successive. I risultati sono:

1.123457

2.123457

12.123457

Osservazioni.

La lunga stringa (valore inserito) di sole cifre viene viene trasformata in numero (valore elaborato) appena si chiede la prima addizione.

Il valore visualizzato mostra al più sei cifre decimali per cui approssima la sesta cifra in base al valore della settima cifra (quella che non si vede).

Per vedere se nel registro di Scratch ci sono altre cifre significative si moltiplca il valore per 1000 con [tasto M]. (per dividere per 1000 usare [tasto D])

Provare a moltiplicare per 1000 più volte per vedere che oltre 16 cifre intere Scratch inserisce degli zeri per poi usare la notazione esponenziale.

Provare a dividere per 1000 più volte per vedere che con 6 zeri dopo la virgola il valore visualizzato è zero.

Riprovare a moltiplicare per 1000 per vedere che nel registro ci sono ancora le cifre significative.

 

[tasto 8]: viene inserito in "x" un numero  di 20 cifre decimali "0.12345678901234567890" dopodiché si divide subito per 1.000.000.

Nel registro il numero è diventato 0.00000012345678901234567890 che evidentemente non può essere interamente registrato come numero e le cifre meno significative vengono soppresse.

Il visore mostra 0 in quanto le cifre decimali sono state spostate di sei posizioni a destra. Con le addizioni successive i risultati sono:

1

2

12

Osservazioni.

Sembrano scomparsi i valori decimali ma è solo un problema del visore in quanto basta moltiplicare per 1000 più volte per vederli riapparire.

Se si moltiplica per mille più volte si vedono i risultati:

12000.000123 ed appaiono le cifre decimali spostate di sei posizioni a destra che rientrano nelle sei cifre decomali del visore;

12000000.123456

12000000123.456787 e si vede l'effetto di avere portato troppo a destra il numero di venti cifre decimali: c'è stata un operazione di aggiustamento del numero  "0.00000012345678901234567890" alla sua 15^ cifra decimale.

 

[tasto 9]: viene inserito in "x" un numero  di 20 cifre decimali "0.12345678901234567890" dopodiché si divide subito per 1012.

Nel registro il numero è diventato 0.00000000000012345678901234567890 che evidentemente non può essere registrato in memoria come numero.

Il visore mostra 0 in quanto le cifre decimali sono state spostate di dodici posizioni a destra. Con le addizioni successive i risultati sono:

1

2

12

Osservazioni.

Moltiplicando per 1000 più volte si giunge a vedere il numero 

 12000000000000.121

dove si apprende che le altre cifre meno significative sono andate perse.

 

link2 ad un articolo che approfondisce i limiti dei numeri calcolati con Scratch.

 

note

nota 1: la notazione "x:= x +1" è utilizzata per significare l'operazione di assegnazione. Il registro denominato "x" viene modificato con un valore che consiste nell'aggiungere "1" al valore presente nel registro stesso. La notazione "x= x+1" spesso trae in inganno persone non avvezze al linguaggio informatico in quanto, se usata in algebra, rappresenterebbe una eguaglianza assurda.

nota 2: si poteva sommare "10" anziché "10 volte 1" ma si è voluto operare con il numero più piccolo diverso da zero per osservare cosa accade sulla cifra meno significativa.

nota 3: il ritardo di 0,2 secondi derve ad evitare leffetto dell'autoripetizione di tasti.

nota 4: ci sono casi in cui una sequenza di cifre va considerata come stringa e non come numero ed il computer deve "sapere" che non si possono  fare operazioni aritmetiche. È  il caso di un numero telefonico: a nessuno viene in mente che per telefonare a due persone contemporaneamente basti fare la somma dei rispettivi numeri di telefono! Quando è il caso, con Scratch è sufficiente aggiungere almeno una lettera o uno spazio al numero come "x:=tel 02 333444555".