[Excel] approssimazioni e precisione di macchina
Premetto che non sono sicuro di postare nella sezione giusta, mi è venuto questo dubbio:
In Excel ho questi numeri in due celle diverse
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!
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
È possibile che sia semplicemente una questione di visualizzazione: forse hai impostato per visualizzare fino a 4 cifre decimali.
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...
Uhm, non credo ho le impostazioni di default. Peraltro i decimali me li visualizza tutti, se ho capito bene quello che intendi...
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.
cavolo, ma quindi è proprio un limite che non si può aggirare? : /
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.
Se hai difficoltà, posso inviarti la funzione già fatta e dirti come inserirla nel foglio Excel.
Spero di esserti stato utile.
Ciao.
Ciao, grazie, se ce l'avessi pronta mi faresti un favore enorme : )
Poi la inserisco come una sorta di macro?
Ciao!
Poi la inserisco come una sorta di macro?
Ciao!
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.
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.
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.
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.
Cavolo : (
insomma, forse è meglio cambiare strumento...
insomma, forse è meglio cambiare strumento...
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).
Come dicevo io excel usa un floating point a 64bit (come il Double di VBA).