Anteprima
Vedrai una selezione di 5 pagine su 18
Tipi primitivi - Algoritmi e strutture dati Pag. 1 Tipi primitivi - Algoritmi e strutture dati Pag. 2
Anteprima di 5 pagg. su 18.
Scarica il documento per vederlo tutto.
Tipi primitivi - Algoritmi e strutture dati Pag. 6
Anteprima di 5 pagg. su 18.
Scarica il documento per vederlo tutto.
Tipi primitivi - Algoritmi e strutture dati Pag. 11
Anteprima di 5 pagg. su 18.
Scarica il documento per vederlo tutto.
Tipi primitivi - Algoritmi e strutture dati Pag. 16
1 su 18
D/illustrazione/soddisfatti o rimborsati
Disdici quando
vuoi
Acquista con carta
o PayPal
Scarica i documenti
tutte le volte che vuoi
Estratto del documento

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

Dettagli
Publisher
A.A. 2023-2024
18 pagine
SSD Scienze matematiche e informatiche INF/01 Informatica

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher ab502 di informazioni apprese con la frequenza delle lezioni di Algoritmi e strutture dati e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli Studi di Pavia o del prof Barili Antonio.