Matematica e statistica con Calc

Sono parecchi i software dedicati alla matematica ed alla statistica.
Da appassionato di software libero non posso non citare Maxima (con il suo semplificante ad interfaccia grafica wxMaxima) e Gretl. Maggiori riferimenti su questi software si trovano nel file PDF allegato al mio articolo “Software libero per calcolare” pubblicato in questo blog e archiviato nella categoria “software libero”. Senza nulla togliere, ovviamente, ai vari Scilab, Matlab, Derive, ecc.
Con questi software si può fare proprio tutto.
Con un foglio di calcolo, come Calc, non possiamo fare tutto: per esempio non possiamo fare calcolo simbolico ma dobbiamo trattare solo numeri. Il che, comunque, non è poco; anche perché, nel tempo, i fogli di calcolo si sono arricchiti di formule e funzioni che ci permettono di compiere analisi numeriche veramente interessanti e sofisticate, molto spesso con difficoltà inconsistenti.
Proprio l’abbondanza di formule e funzioni contenute nei moderni fogli di calcolo mi ha spinto a proporre la selezione contenuta nel lavoro allegato, tendente a far emergere quali siano le più interessanti e proficue in relazione ad alcune delle più ricorrenti finalità dell’analisi numerica.
Gli esperti – e ce ne sono sicuramente tanti più di me – molto probabilmente non troveranno qui nulla che già non sappiano.
I neofiti, siano essi studenti o dilettanti, troveranno invece certamente qualche cosa di utile e scopriranno quanto troppo spesso sia sottoutilizzato quel formidabile strumento che è il foglio di calcolo.
Il foglio di calcolo, chiamato anche foglio elettronico (in inglese spreadsheet), nasce da un’idea del professore universitario Dan Bricklin poi concretizzatasi, con l’aiuto di Bob Frankston, nel prodotto VisiCalc reso disponibile nel 1979 per il computer Apple II e nel 1981 per il PC IBM.
A partire dal 1983 VisiCalc fu soppiantato da un prodotto della Lotus, chiamato 1-2-3, molto più compatto e veloce, poi incluso anche nella suite per ufficio Symphony.
Nel frattempo IBM dotava i propri PC con sistema operativo DOS della serie Assistant, una suite per ufficio che conteneva una sorta di foglio di calcolo molto rudimentale, Planning Assistant.
Tutto venne sbaragliato con il rilascio, il 30 settembre 1985, di Microsoft Excel da parte della Microsoft Corporation. Il successo di Excel fu in gran parte dovuto al fatto di essere il primo foglio di calcolo che si adattava al neonato ambiente operativo Windows del sistema operativo MS-DOS.
Nel frattempo si sono susseguiti altri tentativi di produzione di software di questo tipo.
Nel 1988 ci provò la Borland con Quattro, poi divenuto Quattro Pro, finito nella suite WordPerfect della Novell e finalmente nella suite WordPerfect Office della Corel.
Nella stessa epoca vede la luce il foglio elettronico Calc incluso nella suite StarOffice, sviluppata dalla tedesca StarDivision poi acquisita dalla Sun Microsystem che, nel 2000, rilasciò i sorgenti di StarOffice alla comunità open source dando così vita al progetto OpenOffice. Da questo ceppo nascono i fogli di calcolo oggi inclusi nelle suite Apache OpenOffice, LibreOffice e NeoOffice, specificamente dedicata a Mac OS X, tutte rilasciate con licenza libera. Il foglio Calc di queste suite è in tutto equivalente a Microsoft Excel, con il quale può interscambiare i file.
Il mondo del software libero open source, a partire dal 1998, ha sviluppato e mantiene tuttora un altro foglio di calcolo, Gnumeric, in tutto simile ai citati più evoluti, con la sola eccezione che gli manca la funzione per elaborare tabelle pivot.
Il testo allegato fa esclusivo riferimento al foglio Calc di LibreOffice e gli utenti di Excel, se avranno la pazienza di leggerlo, si accorgeranno che Calc non ha assolutamente nulla da invidiare a Excel, anzi…
Rammento che Calc di LibreOffice è identico a Calc contenuto in OpenOffice e che tutti questi software liberi si possono scaricare facilmente da Internet e sono disponibili per tutti i sistemi operativi per PC, Linux, Mac OS X e Windows.
Il file PDF allegato è liberamente scaricabile, stampabile e distribuibile.

Calc di LibreOffice

Software libero per calcolare

Per una cosa che si chiama computer o, come potremmo tradurre nella nostra lingua, calcolatore il compito più naturale è quello di fare calcoli.
E bisogna riconoscere che, se istruito bene, il computer fa dei calcoli strabilianti: soprattutto li fa praticamente in tempo reale. Senza la velocità di calcolo del computer non sarebbe possibile fare alcune bellissime cose, come quella di navigare nello spazio.
E anche computer con potenza relativamente bassa possono fare grandi calcoli. Esiste addirittura una leggenda metropolitana che afferma come la potenza di calcolo utilizzata per condurre l’uomo sulla luna fosse quella di un Commodore 64, poco più che un computer giocattolo di qualche decennio fa: non è esattamente così, ma è pur vero che i personal computer che abbiamo oggi, addirittura i tablet o i telefonini detti smartphone, come i loro predecessori computer palmari, sono enormemente sovradimensionati con riguardo a quanto serve per fare calcoli.
La cosa più importante e delicata è il software, cioè l’insieme di istruzioni che diamo al computer perché faccia i calcoli che ci servono; insieme di istruzioni che vanno da come il computer deve leggere i dati di ingresso che gli vengono forniti, a quali elaborazioni ed algoritmi esso deve sottoporre quei dati e finalmente a come ci deve fornire i risultati di queste elaborazioni.
La delicatezza del software di calcolo sta nel fatto che, mentre altri tipi di software per scrivere, per disegnare, per creare suoni, ecc., se fatti male, o non girano del tutto o forniscono risultati visibilmente sbagliati o non accettabili, il software di calcolo può fornire risultati sbagliati che noi prendiamo per buoni, molto spesso non avendo modo di capire che sono sbagliati.
Se un computer ci dice che il risultato di 2 + 2 è 5 comprendiamo che il computer ha sbagliato perché sappiamo altrimenti il risultato, tanto che avremmo fatto a meno di disturbare il computer per ottenerlo. Ma se un computer ci dice che per estinguere un prestito di 1.000 euro con 12 rate mensili costanti posticipate al tasso del 2% annuo occorrono 12 rate mensili di 84,23 euro, o ci fidiamo o rifacciamo il conto con un altro computer e con un altro programma. Se poi otteniamo un risultato diverso vai a stabilire chi ha ragione.
Alcune disavventure generate utilizzando il linguaggio di programmazione C hanno per esempio indotto il Dipartimento della Difesa americano ad avviare lo sviluppo del linguaggio di programmazione Ada, che deriva dal C ma ne evita alcune trappole infernali e viene ancora oggi usato in molti contesti in cui il corretto funzionamento del software è critico, come sistemi di controllo di velivoli, del traffico aereo e software aerospaziale.
Il software libero offre ai matematici ed agli scienziati compilatori o interpreti per tutti i linguaggi di programmazione in modo da fornire la possibilità di ottenere dal computer qualsiasi genere di calcolo attraverso istruzioni dirette finalizzate alla soluzione dei più svariati tipi di problema.
Tutto senza trascurare l’offerta di software già predisposti per determinati tipi di calcolo, più agevoli da utilizzare in quanto non richiedono la conoscenza di linguaggi di programmazione.
Qui vorrei mettere a disposizione una mia rassegna di software liberi di quest’ultimo tipo, tutti stracollaudati e fornitori di risultati perfetti.
Si tratta di un file in formato PDF, scaricabile e stampabile, dove si trovano tutte le indicazioni per capire a cosa serve ciascun programma presentato, come possiamo procurarcelo e com’è il suo funzionamento di base.
I software presentati, anche se spesso il loro ambiente nativo è Unix/Linux, sono disponibili anche per i sistemi operativi Windows e OS X.
Per scaricare il file clicca sul suo nome qui sotto.

calcolo

Insidie nei programmi di calcolo

Nel mio articolo sul Software libero per calcolare ho accennato alla delicatezza del software di calcolo ed all’esistenza di alcune trappole annidate nei vari linguaggi di programmazione, con il pericolo che il programma che utilizziamo per fare un calcolo fornisca un risultato sbagliato senza che ce ne accorgiamo.
Al fine di mettere in guardia il programmatore dilettante che voglia cimentarsi nel costruire qualche strumento di calcolo a suo uso e consumo per calcolare, ad esempio, la temperatura percepita nota la temperatura e l’umidità relativa (o altre cose che non troviamo facilmente in programmi già predisposti), ho pensato di indicare in questo articolo quali sono le due principali fonti di complicazione: la questione del separatore decimale e quella della divisione tra interi.

Il separatore decimale

In tutti i linguaggi di programmazione il separatore decimale è il punto (.) ed è questo che deve essere rigorosamente usato nelle assegnazioni interne ai programmi.
Il problema si pone, specialmente per noi italiani abituati ad usare come separatore decimale la virgola, quando è richiesto un input numerico all’utente, in quanto egli, anche se avvisato sul separatore decimale da utilizzare, può sbagliare e ciò può avere, in certi casi, conseguenze disastrose sul risultato dell’elaborazione compiuta dal programma.
I linguaggi più sicuri da questo punto di vista sono Ada, Java, Pascal e Python in quanto in questi linguaggi è imposto un input con separatore decimale punto e, se l’utente usa la virgola, viene elevata una eccezione di input e non viene fornito alcun risultato. Attraverso una opportuna gestione di questa eccezione è possibile avvisare l’utente dell’errore ed invitarlo a formulare un input corretto: il tutto senza uscire dal programma. Se l’eccezione non viene gestita il programma termina senza risultato e il danno è circoscritto a questo.
I linguaggi più subdoli sono il C, il C++ e PHP in quanto impongono il punto ma, se l’utente usa la virgola, non sollevano eccezioni di input, ignorano ciò che viene immesso dopo la virgola e forniscono risultati sballati: il tutto senza che l’utente sappia alcunché, né sull’errore compiuto usando la virgola in luogo del punto né – il che è gravissimo – sul fatto che il risultato che gli è stato fornito dal programma è sbagliato. Unico rimedio a tutto ciò è un accurato controllo dell’input, carattere per carattere, in modo da rimediare alla falla del linguaggio con accorgimenti di programmazione che sollevino un’eccezione gestibile nel momento in cui nell’input venisse trovata una virgola. Eccezione gestibile fino a sostituire un punto alla virgola, nel caso la si trovasse, senza dire nulla all’utente, ed arrivare comunque ad un risultato corretto: in questo modo possiamo avere un programma per il quale va bene l’uso di entrambi i separatori decimali, punto e virgola.
Vi sono, infine, i linguaggi del gruppo Visual Studio di Microsoft, dove i problemi non mancano, anzi…..
Visual C++ di Visual Studio si comporta esattamente come il normale C++.
Visual C# di Visual Studio ha la particolarità che, quando viene caricato su un computer, si adegua alla cultura dell’utente: se il sistema operativo installato è una versione italiana, anche Visual C# sarà italiano. Tra le caratteristiche di questa cultura c’è il fatto che l’utente usa come separatore decimale la virgola e C# si adegua: al suo interno usa rigorosamente il punto come separatore decimale ma quando legge un input dell’utente italiano si aspetta di trovare, come separatore decimale, la virgola. Se l’utente usa il punto, questo viene semplicemente ignorato e il numero viene letto come un intero composto da tutte le cifre immesse, sia quelle prima che quelle dopo il punto e l’elaborazione prosegue con questo numero, con tutte le disastrose conseguenze del caso.
Visual Basic, sia nella vecchia versione, sia in quella più aggiornata, è il massimo della confusione. Anch’esso, al momento dell’installazione, si adegua alla cultura dell’utente ma lo fa parzialmente: mentre, infatti, la funzione Cdbl() per convertire in numero la stringa immessa dall’utente si adegua alla cultura di questi e, se egli usa un sistema operativo in italiano, si aspetta di trovare la virgola come separatore decimale e, se trova il punto, fa avvenire esattamente quello che avviene in C#, la funzione Val(), utilizzabile per lo stesso scopo, si aspetta di trovare comunque il punto come separatore decimale e, se trova una virgola, non legge oltre ed incamera un numero intero composto dalle sole cifre immesse dall’utente prima della virgola e prosegue così il suo percorso di elaborazione. Visual Basic, pertanto, non è solo subdolo ma è anche ambiguo.
Fortunatamente le versioni di Visual C# e di Visual Basic delle più recenti edizioni di Visual Studio hanno la funzione membro Replace() dell’oggetto stringa che, con poca spesa, ci aiuta a correggere l’input in modo da poter accettare invariabilmente sia il punto che la virgola dall’utente (sempre, in Visual Basic, stando attenti alla correzione da apportare in coerenza a che cosa si usa per convertire la stringa).

Divisione tra interi

L’uso dell’operatore / tra due numeri fornisce come risultato il quoziente di una divisione.
Questo risultato è il quoziente vero, qualunque sia il tipo di numero indicato prima e dopo l’operatore /, solo nei linguaggi Pascal, Python 3 e Visual Basic (sia nella vecchia che nella nuova versione). Per quoziente vero si intende il 2,5 che risulta da 5 / 2.
Nei linguaggi C, C++ e C# se i numeri indicati prima e dopo l’operatore / sono interi si ha una divisione tra interi che fornisce come risultato la parte intera del quoziente. Cioè 5 / 2 fornisce il risultato 2. Purtroppo ciò avviene anche quando la variabile cui assegnare il risultato sia stata dichiarata come double, senza che vi sia alcuna segnalazione di errore. Per ottenere il quoziente vero occorre che almeno uno dei due numeri inseriti prima e dopo l’operatore / sia un double (basta scrivere 5.0 anziché 5).
In Java questo inconveniente si presenta soltanto se l’espressione di divisione è inserita in una istruzione di stampa, senza passare attraverso l’assegnazione a variabili. L’istruzione System.out.println(5/2) stampa 2 e, per ottenere la stampa del risultato corretto occorre scrivere System.out.println(5/2.0) o System.out.println(5.0/2). Non è invece possibile, per sollevamento di eccezione nella compilazione, assegnare il risultato di 5/2 ad una variabile dichiarata double, il che, almeno in parte, attutisce i pericoli che Java ha ereditato dal C.
Allo stesso modo di Java si comporta Ada con la sola eccezione che la divisione inserita in una istruzione di stampa, perchè dia il risultato corretto deve avere sia prima che dopo l’operatore / un float. Cioè non basta dire Put(5.0/2) o Put(5/2.0) ma occorre dire Put(5.0/2.0): in caso contrario viene segnalato errore nella compilazione.
Python 2 è nella stessa situazione di Java se l’input è acquistito con la funzione raw_input(), in quanto tutto si sistema se con la conversione della stringa acquisita si memorizza il valore in una variabile float. Se l’input è acquisito con la funzione input(), dal momento che questa, in Python 2, ritorna un valore numerico, occorre che almeno uno dei due numeri sia scritto come float dalla tastiera.