Il modo usato da Scratch per rappresentare numeri, valori e stringhe è stato affrontato in una dell appendici dei libri della collana "coding a scuola":
/ 04-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.
(revisione del 28 luglio 2020)
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 lettere (valore alfanumerico); appena inserito il valore e prima di qualsiasi operazione viene visualizzato "così come è" nel visore (detto anche monitor) della variabile; in questa fase Scratch non ha ancora fatto alcuna operazione (non sa nemmeno se si tratti di un numero o di un parola ...) e viene considerato come una semplice sequenza di caratteri (una stringa);
- valore memorizzato: è il valore che Scratch inserisce nei suoi registri (memorie interne) per effettuare le operazioni richieste; in questa fase Scratch decide se si tratta di un numero o di una parola ed organizza la sua memoria di conseguenza; per saperne di più negli esperimenti proposti 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 (che in Scratch è sempre un punto ".".
Nota: si può immaginare 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, mentre è possibile memorizzare lunghe stringhe di caratteri, parole, frasi e capitoli, non è possibile memorizzare un numero con un numero qualsiasi di cifre e di dimensione comunque grande o comunque piccola. Lo scopo di queste prove consiste proprio nel sondare le capacità di Scratch nel memorizzare numeri quando viene portato ai limiti delle sue possibilità di memorizzazione.
In un primo gruppo di script del progetto "valori" vengono effettuate alcune operazioni per vedere cosa accade usando questa sequenza di operazioni:
1) viene inserito un dato nella variabile "input" (che lo visualizza "così come è);
2) poco dopo il dato viene interessato da un'operazione sui numeri per vedere come viene trattato da Scratch (l'operazione consiste in un una addizione con 0 per tenerlo invariato ma per costringere Scratch a trattare la variabile "input" come un numero);
3) il valore numerico che Scratch estrae da "input" viene inserito nella variabile numerica "x" visualizzata sullo stage;
4 & segg.) si sondano le capacità di Scratch di trattare i numeri molto grandi o molto piccoli.
Lo script
Quando si preme Il [tasto 1], il valore iniziale viene assegnato con la prima istruzione alla variabile "input"
input:= "1234567890" (indicato tra virgolette perchè, per ora, è solo una stringa di caratteri) (nota 1)
successivamente questo valore viene addizionato a 0 e messo nella variabile "x";
successivamente il valore di "x" viena sommato ad un valore numerico che viene memorizzato nella stessa variabile "x":
x:= x+1 per due volte (nota 1 bis)
infine si aggiunge 10 con un ciclo
ripeti 10 volte"x:= x+1" (nota 2)
La figura illustra lo 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 particolari.
Per procedere di un passo occorre premere [tasto P] (Prosegui) così si ha il tempo di osservare cosa succede alla variabile "input" e poi alla variabile "x". (nota 3)
Prove
[tasto 1]: viene inserito in "input" il valore numerico intero di dieci cifre
input="1234567890".
Scratch lo riconosce come valore numerico e lo memorizza in un registro fatto apposta per i numeri. I risultati in successione sono:
1234567890+1=1234567891
1234567891+1=1234567892
1234567892+10=1234567902
Osservazioni.
Si vede che accade quello che ci si aspetta: sul visore appaiono in successione i risultati delle operazioni.
Prove con numeri e lettere
Cosa accade se si inserisce una stringa di sole lettere??
[tasto L]: all'inizio viene inserito in "input" il valore alfabetico "abcd". Al passo successivo Scratch non lo riconosce come numero. Il tentativo successivo di fare operazioni aritmetiche con quel valore fallisce in quanto non sono possibili. L'unica cosa che fa Scratch è di assegnargli un valore numerico nullo. I risultati in successione sono:
null+1=1
1+1=2
2+10=12
Osservazioni. Poiché si chiede un'operazione aritmetica, Scratch ignora le lettere e considera nullo il valore numerico iniziale di "x".
Cosa accade con una stringa mista?
[tasto A]: inizialmente viene inserito in "input" il valore alfanumerico "1234a". I risultati sono identici al caso precedente.
Osservazioni.
Poiché si chiede un'operazione aritmetica, Scratch ignora tutto anche se con le lettere ci sono dei numeri e considera nullo il valore iniziale di "x". Lettere e numeri mischiati sono considerati come una stringa con cui non si fanno aperazioni aritmetiche. (nota 4)
Cosa accade con "spazio"?
[tasto S]: viene inserito in "input" un valore numerico "123 4" con uno spazio. I risultati sono identici al caso precedente.
Osservazioni.
Scratch considera lo "spazio" come un carattere alfabetico e non permette di trattare tutte le altre cifre come un valore numerico su cui fare operazioni aritmetiche.
Una eccezione!
[tasto E]: viene inserito in "input" il valore alfanumerico "1234e3". I risultati sono:
1234e3=1234000
1234000+1=1234001
1234001+1=1234002
1234002+10=1234012
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 e versione 3, 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 "1234e3" significa 1234 moltiplicato 10 elevato a 3 che è uguale a 1234*1000=1234000 come risulta dall'esperimento.
Nota: se non c'è un numero dopo la lettera "e" Scratch considera il tutto una stringa e mette 0 nella variabile numerica "x".
Prove con numeri molto grandi
In questo gruppo di esperimenti vengono inseriti esclusivamente dati numerici per inagare sulla capacità di Scratch di inserire numeri con molte cifre significativa.
Occorre distinguere da quante possano essere le cifre significative che vengono mostrate nel visore e quelle che vengono memorizzate internamente e se ci sono "manipolazioni".
[tasto 2]: viene inserito in "input" un numero intero di 20 cifre "12345678901234567890". I risultati in successione sono:
la variabile x è 12345678901234567000, le ultime tre cifre sono andate perse ed al loro posto ci sono tre zeri, non c'è neanche l'approssimazione al più vicino.
Le operazioni successive danno la sequenza di risultati seguente:
12345678901234567000+1=12345678901234567000
12345678901234567000+1=12345678901234567000 (matematicamente assurdo eppure un computer fa così)
12345678901234567000+10=12345678901234567000
(sic!)
Osservazioni.
La cifra delle unità non cambia: aggiungere 1 alla ventesima posizione non funziona. Alla prima addizione con 0 (che è la fase di acquisizione del numero entro la memoria numerica di Scratch) le cifre oltre la diciasettesima diventano 0. Con le addizioni successive il risultato non cambia in quanto si agisce ancora sulle cifre oltre la diciasettesima. Scratch riesce a mantenere la dimensione del numero ma perde le cifre meno significativa. Dal risultato si può pensare che Scratch tratti al massimo 17 cife significative.
[tasto 3]: viene inserito in "input" un numero intero di 16 cifre uguali "999999999999999". I risultati sono:
x=10000000000000000 (approssimazione accettabile ma sono 17 cifre)
10000000000000000+1=10000000000000000 (?)
10000000000000000+1=10000000000000000 (?)
10000000000000000+10=10000000000000000 (?)
Osservazioni.
Appena la stringa di 16 cifre uguali a "9" viene sccettata come valore numerico, il valore diventa 1 con 16 zeri. Scratch ha approssimato il numero in ingresso correttamente ma le seguenti operazioni non cambiano nulla perchè Scratch non è in grado di trattare numeri che contengano più di sedici cifre significative.
[tasto 4]: viene inserito in "input" un numero intero di 15 cifre uguali "999999999999999". I risultati sono:
x=999999999999999 (tutta la stringa è accettata come numero)
999999999999999+1=1000000000000000
1000000000000000+1=1000000000000001
1000000000000001+10=1000000000000011
Osservazioni.
L'addizione funziona, questo significa che Scratch è in grado di fare operazioni con un numero di 15 cifre intere .
Con [tasto O] il risultato precedente viene moltiplicato per 10 e con le solite addizioni successive (+1, +1, +10) si vede che Scratch non calcola più correttamente le addizioni (non si capisce se le esegua o no).
[tasto 5]: viene inserito in "input" un numero intero di 16 cifre uguali "9999999999999999" ma si effettuano sottrazioni successive. I risultati sono:
x=10000000000000000 (approssimazione accettabile ma sono 17 cifre)
10000000000000000-1=10000000000000000 (?)
10000000000000000-1=10000000000000000 (?)
10000000000000000-10=10000000000000000 (?)
Osservazioni.
Le sottrazioni alla diciasettesima cifra sono ininfluenti.
Scrtach non riesce fare operazioni di addizione e sottrazione sulla diciasettesima cifra.
[tasto 6]: viene inserito in "input" un numero intero di 15 cifre uguali "999999999999999" e si effettuano sottrazioni successive. I risultati sono:
x=999999999999999
999999999999999-1=999999999999998
999999999999998-1=999999999999997
999999999999997-10=999999999999987
Osservazioni.
Le sottrazioni offrono risultati corretti.
Prove con numeri molto piccoli
[tasto 7]: viene inserito in "input" un numero di 20 cifre decimali "0.12345678901234567890" e si effettuano addizioni successive. I risultati sono:
x=0.123457
0.123457+1=1.123457
1.123457+4=2.123457
2.123457+10=12.123457
Osservazioni.
La lunga stringa (valore inserito) di sole cifre viene viene trasformata in numero (valore elaborato) appena Scratch la utilizza come valore numerico.
Il valore visualizzato mostra al più sei cifre decimali per cui la sesta cifra viene approssimata con arrotondamento alla più vicina e le cifre dalla settima in poi non sono visibili.
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 (solo se non si è diviso per più di cento volte per mille).
[tasto 8]: viene inserito in "input" un numero di 20 cifre decimali "0.12345678901234567890"
appena inserito come valore numerico si ha
x=0.00000012345678901234567890
dopodiché si divide per 1.000.000 ed il visore mostra 0 (il visore non mostra più di sei cifre decimali).
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 e comunque alcune di queste cifre si vedono nel registro di x*10^12 che ham un valore di x mille miliardi di volte più grande.
Se si moltiplica per mille più volte si vedono i risultati:
12000*1000=12000.000123 ed appaiono le cifre decimali spostate di sei posizioni a destra che rientrano nelle sei cifre decomali del visore (nota 5);
12000.000123*1000=12000000.123456
12000000.123456*1000=12000000123.456787
Pur ricomparendo le cifre decimali se vede che non ci sono qutte in quanto c'è stata un operazione di aggiustamento del numero "0.00000012345678901234567890" alla sua 15^ cifra decimale.
[tasto 9]: viene inserito in "input" un numero di 20 cifre decimali "0.12345678901234567890" e la memoria numerica di Scratch li registra tutti
x=0.12345678901234567890
dopodiché si divide per 1012.
Il visore mostra 0 in quanto le cifre decimali sono state spostate di dodici posizioni a destra. Con le addizioni successive i risultati sono:
0+1=1
1+1=2
2+10=12
Osservazioni.
Moltiplicando per 1000 più volte si giunge a vedere il numero 12000000000000.121
dove si apprende che le cifre meno significative sono andate perse.
Solo le due cifre più significative del numero originale si mantengono intatte.
ad un articolo che approfondisce i limiti dei numeri utilizzati da un calcolatore.
note
nota 1: la notazione input:= "1234567890", con ":=" è utilizzata per significare l'operazione di assegnazione. Il registro denominato "input" viene modificato con un valore che consiste nell'aggiungere "1234567890" al valore preesistente nel registro stesso, qualunque esso sia.
nota 1 bis: Qui è ancora più chiara la differenza fra la notazione di assegnazione e la notazione di uguaglianza; la notazione "x= x+1" (senza il due punti) viene evitata in quanto 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 1 secondo serve ad evitare l'effetto dell'autoripetizione dei tasti.
nota 4: Il numero telefonico o il codice di avviamento postale sono numeri che devono essere trattati come lettere poichè operazioni arittiche su essi non hanno senso Quando è il caso, con Scratch è sufficiente aggiungere almeno una lettera o uno spazio al numero come "x:=tel 02 333444555" per ottenere questa proprietà. Fa eccezione la lettera "e" seguita da un numero perchè rappresenta un esponenziale.
nota 5: può sembrare strano ed è matematicamente inaccettabile ma si sta lavorando sul visore che fa vedere solo le cifre che hanno deciso i progettisti di Scratch.