Newsgroup: it.comp.macintosh
Titolo: Oops ho un intel!

Dopo diverse bestemmie in questi giorni di programmazione in c++
improvvisamente mi si para di fronte cotanto risultato....
Merdaccia di compilatore, o di processore??
Io faccio così:
----------------------------
cout.precision (15);
  float firstarray[][6] = {
                                {1, 2, 3, 4, 5, 6},
                                {0.3, 0.6,  1.1, 1.7, 2.3, 2.9}
                           };
  printarray (firstarray, 6);
----------------------------
dove printarray è una funzione che serve a stampare il vettore a video,
e il cout della funzione suddetta è (con il cout.precision segnato)
1 0.300000011920929
2 0.600000023841858
3 1.10000002384186
4 1.70000004768372
5 2.29999995231628
6 2.90000009536743
Ma porcatr... Io gli ho detto di inserire 0.3, non 0.300000011920929...
Colpa di intel?? (1+1=1.9999999385631223)
-- 
Guru       Non coltivate i beni terreni,
               non rimarrà niente.
         Coltivate l'amore delle persone,
            vale più di qualsiasi oro. 

 Colpa di intel?? (1+1=1.9999999385631223)
Digli di inserire 0.300000000000000... =/
-- 
Currently playing: Travian [Web] + Mario Strikers [Wii] +
   Devil May Cry 3 [PS2]
iChat/AIM: Nai1105 - ICQ: 205920141 - MSN: 
Nik...@email.it

 parte decimale che vengono "approssimati" per potenze di 2  ?
?
ad esempio 0,3 in binario è un numero periodico 0.0100110011001 ecc. Non
so esattamente quanti decimali usa il mio processore per registrare un
float ma dovrebbe mettere tutte le cifre periodiche fino all'ultimo bit,
e perlomeno darmi il numero che gli iserisco *corretto*....


 Digli di inserire 0.300000000000000... =/
In questo esempio andrebbe bene, ma nel programma originale i dati li
devo inserire a mano, e cambiano a seconda delle funzioni che considero,
mi scoccia stare a controllare ogni volta di scrivere "tot" cifre
significative con tutti gli 0 finali....


 Colpa di intel?? (1+1=1.9999999385631223)
No, normale approssimazine dei numeri in virgola mobile.
I numeri nei pc (PPC, intel, sparc,...) sono approssimati in potenze
di 2.
Esempio:
4 = 2^2
5 = 2^2 + 2^0
0.25 = 2^(-2)
0.125 = 2^(-8)
Se il numero che vuoi scrivere non e' decomponibile in una serie di
potenze di 2, allora il pc si tiene in memoria il numero piu' vicino
(nel caso di 0.3 e' 0.300000011920929).
Qualcun altro aveva avuto lo stesso problema con python poco tempo fa,
e il Martelli gli aveva dato una esauriente risposta credo.
Ciao Jack

   printarray (firstarray, 6);
mi sa che è colpa di questa
-- 
=== Mablung The Heavy Hand ===

 6 2.90000009536743
Se vuoi risultati migliori, usa variabili di tipo "double",
le quali usano 64 bit, con 52 bit per la mantissa, il che
ti assicura errori massimi nell'ordine della sedicesima
cifra significativa.
Se ti serve una precisione maggiore, ci sono delle librerie
per gestire i cosiddetti "big number", cioe' numeri
a precisione arbitraria, ma in questo caso la velocita'
di elaborazione cala di molto.

 2 0.600000023841858
e' colpa (o merito) dello standard IEEEnonricordoquale per la
rappresentazione in virgola mobile che ha una precisione finita
usa double
-- 
The lie is sacred and deception will be our principal weapon

 e il Martelli gli aveva dato una esauriente risposta credo.
Cercherò e leggerò, per cultura personale ormai....


 cifra significativa.
Sai che mi sa che cambierò tutti i float in double!!
Mi spaventa solo l'utilizzo di memoria, visto che mi può capitare di
avere delle matrici da 100x100.....


 usa double
Farò... Poi un po' spero che il fenomeno della cancellazione numerica
possa aiutarmi a far sparire le ultime cifre dopo la virgola....


 avere delle matrici da 100x100.....
Seeeeeeeeeeeeeeeeeeeeeeeeeeeee, io sto facendo un progetto dove devo
gestire matrici piů grandi con salvati dentro numeri molto grandi
(usando la libreria che ti veniva citata prima per alta precisione
matematica, ossia gmp... che finalmente ho capito come far funzionare,
manuale di merda che non dici che sul mio processore devo compilare con
una fottuta flag in piů)...
Vai tranquillo ;)


 avere delle matrici da 100x100.....
vabbè ma 100x100 non è nulla! vai tranquillo

 usa double
Comunque va anche detto che pure con double questi problemi ci sono.
Sono intrinseci.
Aggiungo un'ultima cosa: una piccola colpa Intel ce l'ha. Su un Intel č
*impossibile* fare calcolo in floating point deterministico.
Perchč? Semplicemente perchč i registri fp sono a 80bit.
-- 
blog:  
http://www.akropolix.net/rik0/blogs
 | Uccidete i filosofi,
site:  
http://www.akropolix.net/rik0/
      | tenetevi riso e
forum: 
http://www.akropolix.net/forum/
     | bacchette per voi.

 avere delle matrici da 100x100.....
100x100 = 10000
direi nulla che una macchina attuale non può gestirsi. Al limite
controlla che stia tutto su una stessa pagina di memoria. Ma anche li,
non vedo problemi.


 Perchč? Semplicemente perchč i registri fp sono a 80bit.
Cosa intendi per "calcolo in floating point deterministico" ?

 avere delle matrici da 100x100.....
Una matrice di 100x100 double occupa circa 100x100x8 = 80.000 byte ossia
circa 78 KB.
Tu quante ne devi memorizzare di matrici 100x100 ?
Se fossero anche 10.000 arriveresti ad occupare 78x10.000=780.000 KB
ossia circa 760 MB.
Magari ho un po' esagerato pero' con un normale computer di oggi che ha
in media 2GB ci si puo' anche stare.
-- 
Ciao da Francesco B.

 wrote:

Presumibilmente intende (non usando il termine esattamente nel senso
letterale) "tale che sia facile fare un'analisi della precisione
ottenuta" (perche` "a buzzo dell'ottimizzatore" qualsiasi risultato
intermedio puo` trovarsi rappresentato o a 64 o a 80 bit).
A mio parere e` un punto di vista non ben posto, benche` diffusissimo.
Personalmente (e da ex-professore universitario, a contratto e part-time
eh, di calcolo numerico:-) raccomando
<
http://www.amazon.com/Real-Computing-Made-Engineering-Calculations/dp/0
486442217/ref=pd_bbs_sr_1/103-6519176-9137447?ie=UTF8&s=books&qid=118784
5815&sr=8-1>, il piccolo delizioso capolavoro di Forman Acton: richiede
un minimino di basi matematiche (...ma chi non ha, per dire, digerito
almeno 1 corso universitario di base di Analisi, che ci sta a fare a far
calcolo numerico, mi chiedo...?!-), e non spiega i dettagli di alcuni
classici algoritmi numerici (peraltro facilissimi da reperire in rete o
in mille testi di riferimento), ma e` senza pari nella chiarezza e nella
semplicita` con cui spiega PERCHE` un dato problema si trova a
convergere male (e sbattergli 64 bit invece di 32, o bit illimitati alla
gmp, NON e` la soluzione migliore;-) e COME scegliere quali
trasformazioni algebriche (simboliche) effettuarci per renderlo un
agnellino.  Forse appena un pelino troppo geometrico per i miei gusti
(la mia personalissima preferenza e` per un approccio piu` algebrico e
simbolico e con meno diagrammi, ma so bene di piazzarmi cosi` in una
sparutissima minoranza!-), ma probabilmente ideale per il 99% dei
lettori che, anche occasionalmente, si trovino a fare calcolo numerico
e, cosa strana e fuori moda, ci tengano a CAPIRE che cavolo stanno
combinando (o peggio ancora, cosa stia combinando, magari in
meravigliose e ottimizzatissime funzioni di libreria, il computer a loro
peraltro esplicita richiesta;-).  Mancano alcune delle mie
considerazioni elementari preferite (tipo: come si deve operare per
sommare vettori di milioni di numeri e perche`, perche` calcolare
numericamente le derivate non e` MAI una buona idea, ecc), ma ne
contiene altre (qual e` il modo giusto per calcolare un polinomio, qual
e` l'approccio giusto per calcolare le radici di un'equazione quadratica
e perche`, ecc), oltre a molte cose assai piu` avanzate che Acton riesce
pero` a fare apparire oltremodo chiare e semplici!-)
Alex


E anche altri lavori dello stesso autore (oltre che altri).


 Questo non accade su processore Intel e computazione in floating point.
fammi capire
l'unico modo che riesco a immaginare per il quale quanto affermi possa
essere vero e' che i 16 bit in piu' quando metti un double64 dentro a un
registro a 80 bit vengano riempiti a caso
e' cosi'?

 pero` a fare apparire oltremodo chiare e semplici!-)
Uff, e io a far calcolo numerico sono stato alle prese con un esame che
oserei definire "analisi 1/2", dato che l'unica volta che si sono viste
le problematiche dell'implementazione dei metodi studiati su un
calcolatore, è stato quando il prof ci ha detto che dovevamo fare delle
"esercitazioni", e che ci dovevamo arrangiare....
Dopo molta fatica sono riuscito a scrivere due applicativi in C++ (ok,
scemo io a sceglierlo, ma quello so, e il Fortran l'ho studiato secoli
fa e non me lo ricordo). Se vuoi te li spedisco, così ti fai grasse
risate nel vedere il disastro che c'è.... :-P
P.S. Mi sarebbe piaciuto avere te come prof....


 chi deve fare analisi statica, la questione è alquanto rilevante.
Dal punto i vista pratico, piu' e' alta la precisione dei calcoli
intermedi (cioe' la rappresentazione interna durante le elaborazioni
della unita' floating point), e piu' sara' accurato il risultato finale,
ovviamente sempre all'interno dei limiti imposti dalla
rappresentazione dello stesso.
In pratica, se fai molte operazioni sullo stesso risultato (tali che
gli errori si "accumulino") su dati rappresentati in floating point
a 64 bit (52 bit di mantissa, circa 16 cifre significative in base 10),
se usi un processore che memorizza i risultati intermedi
a 64 bit ottieni un risultato che ha un certo errore, mentre
se usi un processore che memorizza internamente i risultati
a 80 bit l'errore del risultato sara' inferiore.
I procesori Intel hanno una rappresentazione interna dei floating point
a 80 bit; non ricordo bene, ma credo che i vecchi PPC (G4, G5)
avessero una rappresentazione interna a 64 bit (ma potrei sbagliarmi).
Se cosi' e', allora gli Intel sono mediamente un po' piu' precisi
dei PPC.

 registro a 80 bit vengano riempiti a caso
Semplicemente quando fai operazioni a 80 bit il risultato č diverso che
se le fai a 64 bit. Č *vicino*, č entro un dato epsilon. Ma *diverso*.
E diverso non nel senso che l'operazione a 80 bit ha un risultato
differente da qualla a 64 ma troncando gli ultimi 16 bit sono uguali.
Sono risultati di poco diversi. Cosa che in ambito pratico non č quasi
rilevante (per non dire irrilevante), ma che dal punto di vista di chi
ci ragiona formalmente ha bisogno di strutture ben piů complesse per
garantire che i risultati dell'analisi siano conservativi e sound.


 garantire che i risultati dell'analisi siano conservativi e sound.
ma se fai girare il programma (magari un algoritmo numericamente poco
stabile) con lo stesso input il risultato e' lo stesso o no?

 dei PPC.
Non è vero. Perchè gli Intel quando passano per la memoria rappresentano
a 64 bit, per cui la crescita di precisione è trascurabile. Solo uno si
trova risultati inattesi a seconda delle *opzioni* di compilazione.
Oppure si fanno modifiche che da un punto di vista semantico paiono
irrilevanti *e* si scopre che i risultati cambiano.
Dovrei poi andare a spulciarmi i sorgenti di un qualche OS per vedere se
nei cambi di contesto i registri vengono salvati a 80 bit o a 64 bit.
Nel caso il problema sarebbe ancora più fastidioso. In effetti quello
che ci aveva fatto la conferenza ci aveva parlato anche di questo, ma
nel documento che lo linkato di questo specificatamente non parla e non
ho troppo tempo per fare ricerche accurate.


 a 64 bit, per cui la crescita di precisione è trascurabile. ...
Dipende dall'algoritmo che usi.
Se, ad esempio, devi moltiplicare due matrici molto grandi,
tipo da milioni di righe e di colonne, la differenza fra
una i 64 bit e gli 80 bit di rappresentazione interna
si sente eccome !
Se riempi le due matrici con valori casuali, i due risultati
generati sono molto diversi a causa dell'accumulo dell'errore di
rappresentazione, e poiche' con 80 bit questi errori sono inferiori
che con 64 bit, il risultato finale che metterai in memoria a 64 bit
sara' molto piu preciso nel primo caso.
Nei libri o articoli sul calcolo numerico sono spiegati in dettaglio
gli errori generati dalle elaborazioni che usano una precisione finita
per rappresentare i numeri (come i floating point).

 P.S. Mi sarebbe piaciuto avere te come prof....
Heh, troppo buono!-)
Alex

 ragionevole ($16.46 sempre da Amazon).
Vista la scarsità dei corsi (plurale) di Analisi Numerica che ho
seguito, e visto che stimo molto la tua opinione, li ho presi :-) da
amazon.de
 - circa 30 euro in tutto.
Grazie
-- 
Andrea Bergia

 wrote:

Contando IVA e spese postali non c'e` poi male se 29 dollari diventano
30 euro, mi pare!  (Se poi quando li avrai puoi farne una recensione, su
amazon o che, mi piacerebbe sapere il tuo parere).
Alex

 per rappresentare i numeri (come i floating point).
E negli stessi libri e articoli ti insegnano a precisare formalmente
l'errore commesso in funzione dell'errore sui dati di ingresso.
Esattamente come *all'atto pratico* per l'utente non è troppo rilevante
la discrepanza dovuta alle conversioni 80-64 bit dipendenti da
compilatore implementazione e altro, direi che l'utente non può nemmeno
fare il conto su quella precisione aggiuntiva.


 
amazon.de
 - circa 30 euro in tutto.
Mi sa che li prenderò anche io. Dopo tutto se non avessi fatto la tesi
in analisi statica, sarei finito a fare qualcosa di Logica o di Analisi
numerica. 


 la discrepanza dovuta alle conversioni 80-64 bit
Raramente un utente fa una elaborazione dove 64 o 80 bit
(per memorizzare il risultato intermedio) fanno la differenza,
ma in altri (pochissimi) casi tale differenza puo' portare a
risultati molto diversi (differenze dell'1%, 100%, 1000%)

 amazon o che, mi piacerebbe sapere il tuo parere).
Concordo sul prezzo. Per quanto riguarda la recensione, non so quando
avrò tempo di guardarli con cura, ma cercherò di provvedere; grazie
ancora del consiglio.
-- 
Andrea Bergia

 Rabinowitz
Perche' sto pensando alla Temurah?
-- 
Le Carême, ils vont à la boucherie, comme les chiens.

 numerica. 
Ma proprio la matematica "classica" non ti piace? Cioè, PDE, analisi
armonica, analisi funzionale, geometria differenziale, topologia
algebrica... (roba che piace a me ;-) io ho fatto la tesi su calcolo
delle varazioni applicato alle PDE). 
Peccato :-)
-- 
Andrea Bergia

...?-)  Perche` e`
difficile pensare che "Ralston" faccia pensare al Levitico...!-)
Alex

: cos'e' in fondo
il calcolo numerico se non uno studio sistematico delle permutazioni
delle "lettere" che compongono il creato?
Dev'essere colpa del Pendolo di Foucault che ho recentemente terminato
(La prima volta mi aveva (s)finito lui, stavolta l'ho finito io) se
colgo allusioni come queste!


) c'e` una diffusa
idea che gli ebrei Ashkenazi (circa la meta` degli ebrei del mondo,
quelli di discendenza centro- ed est-Europea, e "Rabinowitz" certamente
suggerisce un Ashkenazi) hanno "un IQ mediamente superiore ad altri",
specificamente nelle performance verbali e matematiche.
Qualsiasi siano le cause, culturali e/o genertiche, c'e` poco dubbio che
gli ebrei Ashkenazi sono statisticamente sovra-rappresentati nella
matematica e nelle scienze, specie ai massimi livelli (ad esempio: nel
20esimo secolo, erano circa il 2-3% della popolazione USA, ma hanno
vinto il 27% dei premi Nobel vinti da scienziati USA, il 25% dei premi
Turing, il 26% delle medaglie Fields; nell'URSS, fra il 1947 e il 1976,
erano un po' meno dell'1% della popolazione, ma il 43% dei finalisti ai
Campionati di Scacchi dell'URSS).  Non mi stupisce dunque se si dovesse
osservare un effetto analogo nel calcolo numerico:-).
Alex

 delle varazioni applicato alle PDE). 
Non č che 'propriamente' non mi piace. Č che io *non* sono un matematico
classico. Non ho grossi problemi a studiarla, in se, solo preferisco
dedicare il mio tempo ad altro. Quando qualcosa mi serve  per altro, lo
imparo e basta.
Ma se devo scegliere fra, che so, un po' di Teoria dell'Informazione
secondo Kolmogorov/Chaitin e 'azzo ne so', preferisco il primo.
Poi il mio corso di studi č particolarmente povero in geometria, per cui
non arrivando molto in la uno non si appassiona piů di tanto. Analisi ce
ne č di piů, ma quasi tutta la roba 'utile e noiosa', senza andare nelle
cose piů carine (che ho visto di sfuggita in corsi terzi).
Poi per dire il problema della triennale se uno vuole approfondire č che
non c'č tempo. Quando studiavo Teoria della Misura secondo Lebesgue, per
dire, i frattali me li sono dovuti andare a pippare autonomamente. Che
poi quando in mezzo ad un esame grosso c'č l'argomento che ti piace ma
che non č esaminato, finisce che non ci dedichi abbastanza tempo: e
infatti mi sono scordato quasi tutto.


 non č garantita. Se ci fai conto, cerchi guai.
I 16 bit in piu' li senti quando fai operazioni di accumulo,
ed il prodotto fra matrici, come tante altre operazioni,
fanno intenso uso dell'accumulo, ovverosia
il risultato nei registri interni viene salvato in memoria
solo dopo aver effettuato un gran numero di operazioni
(se le matrici sono grandi).

 (se le matrici sono grandi).
Guarda, io un pochino di sw scientifico lo ho anche scritto eh. E quando
tu parti da dati che hanno un errore di misurazione quantificabile con
10e-6, quando ti metti ad approssimare funzioni continue con spline
lineari (perchč perfino quelle cubiche sono troppo costose) permetti che
quello che succede oltre il 64-esimo bit č piů uno sfizio che altro.
Cioč, ma non č che lo dico io sui due piedi, quando si progetta si fanno
anche quelle tre dimostrazioni per dare un bound all'errore e vedi bene
che siamo su altri tenori.
Poi magari tu fai calcolo scientifico diverso da quello che ho fatto io
(:P), ci lavori (e io no, ora). Perň diciamo che la maggior parte delle
persone che ho sentito e con cui ho lavorato, per la maggior parte dei
lavori, sono costrette a tollerare errori ben piů grossi senza poterci
fare nulla.
