[Excel] approssimazioni e precisione di macchina

ReggaetonDj
Premetto che non sono sicuro di postare nella sezione giusta, mi è venuto questo dubbio:

In Excel ho questi numeri in due celle diverse
a = 0,999948600916960000000000
b = 0,000051399083040358600000


ora se io calcolo $c = a + b$ ottengo $c = 1$ il che, guardando i due numeri, mi sembra un po' strano.

Peraltro se calcolo $d = 1 - a$ mi aspetterei $d = b$ invece no! Ottengo $b -d = 2,7624116102215E-16$

Come mai? E' un problema di approssimazione? E come mai con le somme di numeri periodici questo non avviene?

Grazie!

Ciao!

Risposte
vict85
È possibile che sia semplicemente una questione di visualizzazione: forse hai impostato per visualizzare fino a 4 cifre decimali.

ReggaetonDj
Ciao e grazie per la risposta : )

Uhm, non credo ho le impostazioni di default. Peraltro i decimali me li visualizza tutti, se ho capito bene quello che intendi...

vict85
OK, ho rifatto i calcoli. Il problema è che fa i calcoli con un certo numero di cifre ma i numeri sono in forma esponenziale. Sostanzialmente ha almeno 11-12 cifre decimali (16-5) ma meno di 15-16. Libreoffice, da un test fatto ora, sembra che arrivi a 14 cifre.

ReggaetonDj
cavolo, ma quindi è proprio un limite che non si può aggirare? : /

Marek64
Mi permetto di suggerirti una soluzione alternativa: potresti creare una funzione di calcolo in VBA impostando le variabili a e b (e anche c e d, se necessario) come Double, dovresti ottenere una precisione maggiore di quella di "default".
Se hai difficoltà, posso inviarti la funzione già fatta e dirti come inserirla nel foglio Excel.
Spero di esserti stato utile.
Ciao.

ReggaetonDj
Ciao, grazie, se ce l'avessi pronta mi faresti un favore enorme : )

Poi la inserisco come una sorta di macro?

Ciao!

Marek64
C'è quale problema; ti riporto una spiegazione tecnica, che forse potrà esserti utile:

Quando si utilizzano numeri a virgola mobile, quali Tipo di dati Single (Visual Basic) e Tipo di dati Double (Visual Basic), tenere presente che sono archiviati come frazioni binarie. In altre parole, non possono contenere una rappresentazione esatta di qualsiasi quantità che non sia una frazione binaria (del formato k / (2 ^ n), dove k e n sono numeri interi). Ad esempio 0,5 (= 1/2) e 0,3125 (= 5/16) possono essere mantenuti come valori precisi, mentre 0,2 (= 1/5) e 0,3 (= 3/10) possono essere solo approssimazioni.

La funzione, comunque, è la seguente e va inserita come macro:

Function sommaCifre(ByVal a As Variant, ByVal b As Variant) As Variant

sommaCifre = a + b

End Function

Mi spiace, ma meglio di così non riesco a fare.
Ciao.

vict85
Un double di Visual Basic, come uno del C++, ha una precisione di circa 16 cifre. Un numero a precisione singola ne ha meno. In alcuni linguaggi esiste anche una rappresentazione a 128 bit che raggiunge precisioni doppie rispetto al double.

Sinceramente penso che Excell possa già usare i double di default. L'uso dei numeri a precisione singola per i calcoli matematici è scientifici è infatti fortemente sconsigliato e generalmente evitato. Non penso che usare uno script VB aiuti. Al massimo sposta la precisione di 2 cifre decimali. Nulla di che insomma.

ReggaetonDj
Cavolo : (

insomma, forse è meglio cambiare strumento...

vict85
Sembra che wikipedia ne faccia riferimento http://en.wikipedia.org/wiki/Numeric_pr ... soft_Excel

Come dicevo io excel usa un floating point a 64bit (come il Double di VBA).

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.