vuoi
o PayPal
tutte le volte che vuoi
L’unico operatore significativo per i caratteri è stabilire
se sono uguali, si può poi fare un ordinamento
lessicografico che è complesso.
Tutti questi codici sono definiti da standard internazionali
perché è l’unica maniera che abbiamo per interpretare
correttamente un testo quando viene trasmesso
dall’altra parte dell’oceano. Alcuni formati esterni di
scambio portano scritto direttamente in modo esplicito
qual è la codifica utilizzata, come l’XML, la prima riga
dell’XML contiene una scritta che dice qual è la codifica
dei caratteri utilizzati successivamente, le pagine HTML
come prima riga dice qual è la codifica della pagina,
analogamente per le mail, sono un tipo di codifica
tuttora fatta con l’US-ASCII
DateTime
Le date sono fondamentali, sbagliare una data o mal
interpretarla significa perderci o guadagnarci milioni di
dollari, le date sono usate anche come timestamp,
quindi per marcare temporalmente eventi. Anche la
rappresentazione delle date è standardizzata secondo lo
standard ISO 8601, la rappresentazione interna delle
date è però è molto complessa, per esempio nel corso
del tempo sono state utilizzate codifiche molto strane,
unix usa l’epoch che è una codifica su 32 bit del numero
di millisecondi trascorsi dal 1 gennaio 1970, anche la
data del resto è convenzionale, la data che noi usiamo,
quella gregoriana, stabilisce convenzionalmente un
sistema di numerazione che è pure sbagliato perché
l’anno 0 non esiste, si è passati dal -1 al +1.
L’anno 2000 è stato un problema perché si riteneva che
molti software usavano una codifica dell’anno su 2 cifre
e con il passaggio all’anno 2000 saremmo passati da
1999 al 1900, con tutto quello che ne consegue nei
calcoli, soprattutto nei sistemi di controllo. Il problema
sembrava inizialmente legato alle banche che però
hanno fatto notare che i mutui a 30 anni li facevano
anche nel 1970, quindi sapevano indicare già il 2000,
però molti sistemi di controllo, basati ad esempio su
controllori a 8 bit, usavano per risparmiare delle
codifiche molto compatte e il rischio era che qualcosa,
nel fare il rollover(passaggio da 1999 a 1900, non so se
si chiama così) sballasse completamente quello che era
il comportamento di quel sistema, alcuni sistemi che
avrebbero provocato disastri sono stati subito corretti.
I computer rappresentano DataTime con un formato
standardizzato che è sostanzialmente è quello
aaaammggoreminutisecondi,frazioni di secondo, le
frazioni di secondo solo che ha quella precisione, quindi
si rappresentano come: 20220311T120000
Avendo la T che divide la parte della data da quella
dell’ora noi abbiamo comunque un punto preciso dove
separare le due cose
Rimane il problema del fuso orario, questa è la ragione
per cui al mondo, sia i computer che molti dispositivi,
come sistemi operativi, rappresentano internamente
tutto su base UTC, viene usato l’UTC perché in questo
modo ci si può sincronizzare con macchine in altri posti
del pianeta, e vogliamo sapere che ora è in quel punto
del pianeta, se non si fa così non funziona più ad
esempio il sistema di autenticazione alle mail etc…,
quindi per evitare di fare continui cambiamenti di fuso
orario ogni volta che uno si sposta si tiene come base
l’UTC e anche il protocollo NTP, che quello che via rete
sincronizza gli orologi dei computer, li sincronizza
sull’UTC.
Per quanto riguarda la rappresentazione esterna le
persone non lavorano in UTC ma in ora locale quindi
quando comprano un dispositivo devono dire in che fuso
orario si trovano ma quando si configura un computer o
un cellulare di solito noi diciamo dove siamo, oppure lo
capisce da solo con il GPS, e aggancia l’ora locale di
quella particolare zona, quindi il problema è che in realtà
i fusi orari sono convenzioni di natura politica e non
fisica, quindi l’Italia in realtà non sta usando l’ora del suo
fuso orario, a parte l’ora legale, sta usando l’ora media
dell’Europa perché questa è la convenzione che viene
usata.
E’ più un problema di rappresentazione interna che
esterna. Internamente è un problema perché software
diversi o sistemi operativi diversi possono usare
codifiche differenti, unix usa le epoch, windows usa una
rappresentazione in microsecondi a partire dal 1 gennaio
1900 (forse), nei software di microsoft l’ora è data in
secondi in virgola mobile, quindi in secondi e frazioni di
secondi, a partire da una certa data, qiundi quello che
noi vediamo se dichiariamo una cella come valore di
data è una traduzione di un valore in secondi che viene
fatto internamente dalla macchina.
Quindi internamente le ore sono rappresentate come o
numeri in virgola fissa, tipo unix e windows, o numeri in
virgola mobile come secondi e frazioni di secondo a
partire da una certa data. I numeri in virgola fissa hanno
una precisione infinita mentre quelli in virgola mobile no,
quando li sommiamo ovviamente possiamo perdere dei
decimali.
Per convenzione ci sono sistemi come le email che
utilizzano una rappresentazione dove invece il fuso
orario è esplicito, cioè viene indicato un’ora che è l’ora
locale e di fianco qual è il fuso orario.
Le dateTime sono un formato che in alcune architetture
è rappresentato anche come tipo nativo ma il più delle
volte si usa una rappresentazione intera o quella in
virgola mobile della macchina e poi si fa un
ragionamento a livello di sistema operativo, sia per
ottenere la rappresentazione interna che quella esterna.
Google takout permette di scaricare i propri dati
mediante file json, tutti i json contengono le date in
epoch, quindi dove ci dovrebbe essere una data c’è un
numero, per tradurlo o utilizziamo librerie che esistono in
python oppure online, con copia-incolla si capisce che
data è.
La rappresentazione esterna aaaa/mm/gg 00:mm:ss è la
migliore perché segue un ordine cronologico.
Sulle date può essere definito un ordinamento, sulla
rappresentazione interna non ci sono problemi perché
che sia intero o in virgola mobile l’ordinamento naturale
di quella rappresentazione è anche quello cronologico,
se usiamo invece la notazione esterna, se usiamo quella
standard, è quella che fa coincidere l’ordinamento
lessicografico e quello cronologico, qualunque altra
invece no.
Integer
Il tipo astratto intero sono gli interi, normalmente si
intendono gli interi relativi, non quelli naturali, o se si
intendono quelli naturali lo si specifica. Essendo un tipo
astratto può permettersi di essere infinito.
Sfortunatamente nessuna macchina è in grado di
rappresentare un intero astratto, è necessario
rappresentare un sottocampo degli interi, quelli
rappresentabili da una macchina, se noi abbiamo una
architettura a 32 bit e usiamo la rappresentazione a 32
bit di interi, possiamo andare da -2 miliardi a +2 miliardi,
con 64 bit abbiamo ovviamente un range molto più
ampio degli interi rappresentabili ma rimane il fatto che
è un sottocampo di un insieme infinito, un sottocampo
finito di un insieme infinito.
Abbiamo anche opzioni per rappresentare gli interi in
macchine e sono normalmente indicati come signed int e
unsigned int. Int non é l’integer, int è un insieme finito,
int è il tipo nativo principale, cioè le macchine sono
contruite intorno all’int, (integer è il tipo astratto e int la
sua rappresentazione interna, credo). L’int è un
sottocampo e l’aritmetica degli int non è l’aritmetica
degli interi, se noi facciamo n+1 sugli interi integer
andiamo avanti all’infinito senza mai ritornare sullo
stesso codice, se noi facciamo su un int n+1, arrivati alla
fine del campo rimbalziamo all’inizio, quindi è come se il
valore più grande rappresentabile in macchina fosse
contiguo al valore più piccolo rappresentabile in
macchina, che non è sempre una cosa desiderabile, cioè
l’aritmetica cosiddetta “in modulo” non è
necessariamente l’aritmetica migliore per tutte le
applicazioni, ad esempio mi aspetto che se aumento la
luminosità di un pixel, quando arrivo alla massima
luminosità rappresentabile succede che quel pixel
rimane a quella luminosità ma se utilizziamo l’aritmetica
intera e sommiamo un valore a quel pixel, esso diventa
nero, prima diventava il più bianco possibile, quindi il
pixel più bianco possibile diventa contiguo a quello più
nero possibile, in elaborazione immagini questo può
essere un problema, dobbiamo continuamente
controllare le condizioni di bordo perché se sommiamo,
quindi incrementiamo il valore di luminosità di un pixel,
rischiamo di farlo diventare più scuro anziché più chiaro
come ci aspetteremmo, questo perché usiamo una
codifica intera di una grandezza (luminosità) che non è
un intero, segue infatti una matematica diversa, si
chiama aritmetica saturata, vuol dire che arrivati a un
certo punto n+1 fa n e non -n.
Ci sono state alcune macchine di Intel e di AMD che
hanno implementato l’aritmetica saturata in hardware,
questo perché in quel periodo moltissime operazioni
grafiche venivano effettuate dalla CPU, quindi era
importante avere un’aritmetica efficiente per poter fare
questo tipo di calcoli. Ora invece ci sono coprocessori
grafici, cioè schede grafiche, in cui l’aritmetica saturata
è data per scontata.
Per quanto sia naturale pensare a un valore di luminosità
come a un numero intero non è ovvio che la luminosità
segua la stessa matematica degli interi, essa ha una sua
matematica ed è un tipo astratto a se, quindi il pixel
potrebbe essere definito come un oggetto diverso
dall’intero con cui è codificato in macchina, e questo
rende l’idea di cosa di intende per codifica, essa è:
“implemento nel modo migliore possibile una grandezza
che ha sue leggi e una sua matematica differente
probabilmente da quella degli interi pensati per altri
scopi”
Rational
I numeri razionali, essi traducono l’insieme Q che è un
insieme infinito quanto quello degli interi e anche lui ha
problemi di implementazione, i numeri razionali non
fanno parte dei tipi nativi di una macchina, hanno
applicazioni molto specifiche