M3.1112 Pythonerie[1]

L’argomento di questo articolo (e dei prossimi) sarà: LE BELLEZZE DELL’ARITMETICA IN VIRGOLA MOBILE (con Python se vi pare)

Premettiamo che tutto quello che vedrete riguarda TUTTI i linguaggi di programmazione, nessuno escluso, o perlomeno tutti quelli che implementano i numeri in virgola mobile (float).

Come abbiamo visto in LAM, se tentiamo di eseguire molte operazioni su numeri reali (decimali) possiamo ottenere risultati completamente sballati, grazie agli errori di arrotondamento.

Inoltre abbiamo notato come sia impossibile stabilire se un numero reale è zero per il problema dello zero-macchina.

Tutte queste problematiche derivano sostanzialmente da due fatti:

  1. i numeri in virgola mobile sono memorizzati in una quantità FINITA di memoria (53 bit per la mantissa in python)
  2. i numeri sono memorizzati in forma binaria

Il primo fatto ha come conseguenza l’impossibilità di rappresentare numeri che abbiano una parte decimale particolarmente lunga (più di 15 cifre) e SICURAMENTE non un numero IRRAZIONALE (p.es. \sqrt{2}). Va da sé che questi numeri sono rappresentati in modo APPROSSIMATO in macchine e quindi tutte le operazioni porteranno a qualche ulteriore approssimazione, finché, dopo molti calcoli, se non siamo accorti, possiamo arrivare a risultati completamente sbagliati.

Ma c’é di peggio: il secondo fatto ha la seguente simpatica conseguenza: supponiamo di voler rappresentare il numero \frac{1}{10} cioè 0,1 che in forma decimale non pone alcun problema; in forma binaria (voi che ne sapete più di me) otteniamo la sequenza:

0.1= 0.0001100110011001100110011 ...

che non termina MAI. In altre parole, possiamo rappresentare il numero 0,1 solo in modo APPROSSIMATO in forma binaria pura. Quindi, finché usiamo calcolatori binari, dobbiamo tenerci questa rogna. Il vero valore di 0,1 in forma decimale rappresentabile nei 53 bit di python è :

0.1=0.1000000000000000055511151231257827021181583404541015625

perciò, ogni volta che facciamo calcoli che coinvolgano questo numero (e altri) automaticamente ci dobbiamo aspettare errori di arrotondamento, come abbiamo sperimentato venerdì con il problema della funzione strarange().

Basta discorsi per ora. Adesso qualche esercizio.

Lavoriamo ancora sulla funzione strarange(a,b,delta) che, ricordo, deve fornire in return una lista di numeri reali da a fino a b con passo delta.

Realizzate la funzione, osservate quello che succede con i numeri in float  e postatela qui che possiamo vederla.

Ricchi premi a chi ha la vista più acuta.

p.s.

una delizia: se scrivete: from decimal import * e poi usate la funzione Decimal(x) su un numero x potete averne la rappresentazione completa, decimale in memoria.

Questa voce è stata pubblicata in Algoritmi, Aritmetica, Informatica, M3, M3.1112, Matematica, numeri reali, Programmazione e contrassegnata con , , , , , , . Contrassegna il permalink.

Una risposta a M3.1112 Pythonerie[1]

  1. Mattia Buso ha detto:

    Prof domani c’è Verifica di Python? perchè oggi Rossi ci ha detto che non sapete ancora quando farla..

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...