Il concetto di "Computed GO TO" in Fortran è uno strumento che consente il trasferimento del controllo del programma in base al valore di una variabile intera. Questo tipo di controllo permette di migliorare la struttura di un programma, specialmente quando si desidera eseguire operazioni condizionali o cicliche senza utilizzare una serie di comandi condizionali "IF". La sintassi generale del "Computed GO TO" è la seguente: GO TO (N1, N2, ..., Nk), I, dove I è la variabile intera che determina la destinazione del salto. Se il valore di I è compreso tra 1 e k, il controllo verrà trasferito alla riga corrispondente a N1, N2, ..., Nk. Qualora I fosse fuori da questi limiti, il comando viene ignorato e il programma prosegue normalmente.
Un esempio pratico dell'uso del "Computed GO TO" si trova in un semplice programma di calcolatrice che permette di eseguire le quattro operazioni aritmetiche di base (somma, sottrazione, moltiplicazione e divisione), con un'opzione per l'uscita dal programma. Il programma inizia leggendo due numeri, quindi presenta un menù di opzioni all'utente per scegliere quale operazione eseguire. Dopo aver eseguito l'operazione scelta, il controllo del programma viene trasferito a una sezione specifica dove l'utente può decidere se continuare con un'altra operazione sui numeri iniziali o lavorare con nuovi numeri. Il trasferimento del controllo tramite "Computed GOTO" è il cuore di questa interazione dinamica, rendendo possibile l'esecuzione di operazioni multiple senza la necessità di codice complesso o ridondante.
La sintassi e la struttura del programma di calcolatrice illustrano chiaramente come il "Computed GOTO" consenta di semplificare la gestione delle operazioni, riducendo la necessità di molteplici istruzioni condizionali. Dopo ogni operazione, il programma richiede all'utente se desidera eseguire un altro calcolo. Se la risposta è affermativa, il controllo ritorna al menù delle operazioni, altrimenti il programma termina.
Oltre all'utilizzo del "Computed GO TO", è fondamentale comprendere come la gestione del flusso di controllo attraverso comandi come IF-THEN-ENDIF possa essere altrettanto potente in situazioni che richiedono l'esecuzione di più istruzioni in base a condizioni logiche specifiche. Il comando IF-THEN-ENDIF viene utilizzato per eseguire un blocco di codice solo quando una condizione è vera, e il blocco di codice può contenere più istruzioni, offrendo così una maggiore flessibilità nella scrittura di programmi complessi.
Un esempio di utilizzo di questo comando si trova nell'implementazione di serie matematiche, come la serie per il calcolo del coseno, del seno e della funzione esponenziale. Ogni serie è valutata successivamente a una condizione che verifica se il termine della serie è sufficientemente grande da essere aggiunto alla somma totale. Se un termine è troppo piccolo, il programma esce dal ciclo e stampa il risultato finale, confrontandolo con il valore ottenuto dalla funzione di libreria per il calcolo del coseno o del seno.
L'esecuzione di tali operazioni è resa possibile grazie al controllo preciso dell'iterazione tramite variabili come i, che determinano l'ordine dei termini nelle serie, e t, che rappresenta il termine attuale. Ogni volta che un nuovo termine è calcolato, viene confrontato con un valore soglia (ad esempio, 10^-8), e se il termine è maggiore di tale valore, il programma lo somma alla somma totale, incrementando il numero di termini considerati.
Nel caso delle serie trigonometriche o esponenziali, la precisione del risultato dipende dal numero di termini sommati. Per migliorare la comprensione, il programma restituisce anche il valore della funzione matematiche ottenuto tramite una libreria standard, così da poter comparare i risultati ottenuti tramite il calcolo diretto della serie con quelli calcolati attraverso metodi più efficienti.
Infine, è importante comprendere come l'uso di variabili di controllo come nct, che conta il numero di termini inclusi nella somma finale, e abs(t), che verifica l'accuratezza del termine corrente, permetta di gestire in modo preciso la convergenza delle serie. La gestione corretta di queste variabili è cruciale per evitare errori di precisione che potrebbero compromettere i risultati finali.
Perché i numeri decimali non possono essere rappresentati esattamente in formato binario e le implicazioni per i calcoli nei computer
Nei computer, i numeri non sono rappresentati nel formato decimale a cui siamo abituati, ma nel formato binario. Questo comporta inevitabilmente delle approssimazioni quando si tratta di numeri decimali frazionari. Ad esempio, il numero 5.6, sebbene rappresenti un valore preciso nella notazione decimale, nel sistema binario può essere memorizzato come 5.5999999, una piccola differenza, ma comunque rilevante in alcune operazioni.
Il motivo di queste approssimazioni risiede nel processo di conversione dei numeri frazionari decimali in numeri binari. Per comprendere meglio il motivo di queste discrepanze, vediamo come avviene tale conversione. Nel sistema binario, un numero decimale frazionario come 0.625 viene trasformato moltiplicando la parte frazionaria per 2, ripetendo il processo fino a quando la parte frazionaria diventa zero. Nel caso di 0.625, la sequenza di moltiplicazioni produce 0.101 come risultato binario, che è esatto.
Tuttavia, nel caso di numeri come 0.1, la conversione binaria diventa un processo infinito. Per capire meglio, vediamo come si svolge la moltiplicazione:
-
0.1 × 2 = 0.2, il primo bit binario è 0
-
0.2 × 2 = 0.4, il secondo bit binario è 0
-
0.4 × 2 = 0.8, il terzo bit binario è 0
-
0.8 × 2 = 1.6, il quarto bit binario è 1
-
0.6 × 2 = 1.2, il quinto bit binario è 1
Il processo continua indefinitamente, ripetendo la sequenza di 0.110011 fino all'infinito. Poiché non possiamo continuare indefinitamente, l'operazione di conversione viene interrotta dopo un numero limitato di passi, a seconda della precisione dei byte del processore e della rappresentazione del numero in memoria. Se utilizzassimo 16 bit per rappresentare 0.1, il risultato binario sarebbe 0.00011001100110011..., che è approssimativamente uguale a 0.099990844, ma non esattamente 0.1.
Questo fenomeno di rappresentazione approssimata si verifica non solo per i numeri frazionari decimali, ma anche per altri numeri che non hanno una rappresentazione binaria finita. I computer, quindi, devono fare delle scelte su quanta precisione utilizzare, e in molti casi, questo porta a piccole perdite di dati, come nel caso del numero 5.6, che diventa 5.5999999.
Un altro aspetto fondamentale è che la rappresentazione di questi numeri frazionari può variare a seconda del tipo di dato utilizzato. In modalità a precisione singola, ad esempio, la rappresentazione del numero binario sarà meno precisa rispetto a una modalità a doppia precisione, che usa più bit per memorizzare i numeri. La precisione del calcolo dipende, quindi, dalla capacità della macchina di gestire questi numeri in modo efficiente, il che è cruciale in applicazioni scientifiche e ingegneristiche che richiedono grande accuratezza.
Inoltre, va considerato che in alcuni casi, questi errori di rappresentazione possono accumularsi durante calcoli complessi, portando a risultati imprecisi che potrebbero alterare l’esito di un programma o di un'analisi numerica. Pertanto, è importante che gli sviluppatori e gli ingegneri software siano consapevoli di queste limitazioni e sappiano come gestirle. Spesso, infatti, è necessario implementare tecniche per ridurre gli errori di arrotondamento o evitare che essi influenzino i risultati finali.
Per esempio, uno degli approcci più comuni per mitigare questi problemi è l'uso di formati di dati a maggiore precisione, come il doppio o il quadruplo, che riducono l'incidenza degli errori dovuti alla conversione. Inoltre, la gestione accurata degli arrotondamenti è fondamentale quando si progettano algoritmi numerici, soprattutto per calcoli che coinvolgono molte operazioni su numeri in virgola mobile.
In generale, è essenziale comprendere che, mentre i numeri nei computer non possono mai essere rappresentati con precisione assoluta, esistono tecniche per minimizzare gli errori e garantire che i risultati siano utili e sufficientemente accurati per gli scopi dell’applicazione. La consapevolezza di queste limitazioni è la chiave per sviluppare software robusto e preciso, in grado di gestire efficacemente le sfide legate alla rappresentazione dei numeri.

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский