martedì 23 luglio 2013

La matematica come ferro del mestiere


Il post di ieri Uno vale uno? o quanto? sta avendo parecchio successo. Merito di Annarita (prof. lancia più spesso queste esche, p'r piasì) e di .mau. che nei commenti invita al rigore quasi fosse un teologo. Cosa buona e giusta (grassie!) ma io appartengo alla classe di Marco Bruno, noi abbiamo i numeri spessi.
Inoltre sono innamorato della prova che ripeto qui sotto (sì mi piace davvero tanto-tanto):

1/3 = 0.333... +
2/3 = 0.666... =
----  --------
3/3 = 0.999...


E mi viene voglia di fare come Katie, usare la calcolatrice --OPS! non ce l'ho. Non ce l'ho più da tanto tempo, beh, uso il 'puter.
E anche lì, portate passiensa non ho Windoze Windows, uso Linux ma in fondo è quasi la stessa cosa (anzi meglio, molto), Python, Ruby e Clojure ci sono anche per Windows, basta installarli, sono anche gratuiti.

Quando devo usare il computer come se fosse una calcolatrice uso Calc, così:


Si comporta esattamente come la calcolatrice, arrotonda l'ultima cifra, mette ~ per dire che il numero è approssimato e la somma è giusta. Molto bene, promosso.

In realtà il programma per fare queste cose su Linux (e prima su Unix) sarebbe bc (binary calculator). Esiste anche il suo antenato dc (desktop calculator) ma è meno usato, per la sua sintassi sexy ma inusuale. Vediamo bc:


Intanto una cosa: bisogna dirgli quante cifre decimali vogliamo, con scale, io ho scelto 20 ma se volete fare volume potere scrivere anche 1000 o anche di più.
Siccome la precisione te la lascia definire non arrotonda, neanche il risultato della somma, ovviamente.
Ecco bc non soddisfa le esigenze di Katie ma ha altri assi nella manica, per esempio puoi esprimere i numeri in che base vuoi. Per cui bene, promosso.
  
Fin qui abbiamo visto delle calcolatrici ma i linguaggi di programmazione?
OK, ne vediamo un paio (abbondante) e poi un link per chi vuole approfondire. Prendo in considerazione i linguaggi più semplici e conosciuti, quelli che vanno per la maggiore, ecco Python:


Siccome uso la versione 2.x devo dirgli che la divisione è tra numeri reali (dai .mau., lo so che sono impreciso, spesso, porta passiensa!) per cui scrivo 1.0; se scrivessi solo 1 il risultato sarebbe 0. Nella versione 3 questo non è più necessario.
Il risultato di 2/3 non è arrotondato, anche perché volendo potrei fargli scrivere più cifre.
La somma è 1.0, giusta. Molto bene, promosso.

L'alternativa a Python è Ruby (ce ne sarebbero anche altre ma per adesso credo basti), vediamo:


Preciso identico a Python; no, se hanno copiato non me ne sono accorto.
Molto bene, promosso.

Adesso vi dico 'na roba che è un po' fuori dall'ordinario, ma vedrete che è semplice, facile-facile. Ci sono dei linguaggi che hanno i numeri razionali, per esempio in Clojure (un dialetto moderno del Lisp (Fermi lì!!! non c'è pericolo, poi se l'ho capito io...)), c'è il tipo Ratio:


È un linguaggio funzionale, per definire una var devo usare def. Alla fine la N di 1N mi dice che il numero è a precisione estesa. E poi c'è la solita (per il Lisp) notazione prefissa (con abbondanza di parentesi). OK, promosso con lode!

I numeri razionali ci sono anche in Python, ecco qua:


Devo dirgli di caricare un paio di moduli (la forza di Python esiste un modulo per fare tutto quello che vuoi, c'è anche antigravity), sì, OK, non bello esteticamente, ma bene, promosso.

Bonus: ma mica possiamo accontentarci di questo! potrebbe dire uno dei pochi superstiti arrivati fin qua. No di certo!, risponderei io. Mancano i linguaggi principali, C, C++, Java, ... E se aveste dovuto usare il 'puter dell'immagine là in alto dovevate usare il Fortran o il Lisp.
Niente panico, fate un salto da Rosetta Code (come farei se non ci fosse Rosetta?) e li trovate tutti, anzi di più, qui: Arithmetic/Rational

3 commenti:

  1. Tutti promossi caro Ing.
    Credo non potesse essere altrimenti parlando di linguaggi di programmazione e di matematica con i numeri reali. Il troncamento dei decimali con successiva possibile approssimazione all'ultimo decimale è un limite fisico che, per quanto si possano usare tipologie di variabili più o meno idonee o linguaggi con architetture differenti, possono solo "simulare" l'infinito ma non replicarlo.
    Quindi SI, in informatica 0,(9)=1, per quanto sia il risultato di una "forzatura" dovuta ad un limite fisico per ora (più in la non si sa) insormontabile.

    RispondiElimina
  2. Quasi tutti reali; con Clojure i componenti di Ratio sono interi.

    RispondiElimina