Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

codice instabile

19 views
Skip to first unread message

pino mugo

unread,
Sep 8, 2020, 8:36:05 PM9/8/20
to
Questa successione numerica definita per ricorrenza deve dare ovviamente sempre lo stesso valore per ogni termine ( cioè sempre 1/77) , invece da tutti valori diversi!

public class successione {

public static void main(String[] args) {

int n = 10;
double s = 1.0/77.0;
System.out.print("First " + n + " terms: ");

for (int i = 1; i <= n; ++i)
{
System.out.print(s + " x ");

double r = 78.0 * s - 1;
s = r;

}
}
}

ciao

Giorgio Pastore

unread,
Sep 19, 2020, 5:25:45 AM9/19/20
to
Il 09/09/20 02:36, pino mugo ha scritto:
> Questa successione numerica definita per ricorrenza deve dare ovviamente sempre lo stesso valore per ogni termine ( cioè sempre 1/77) , invece da tutti valori diversi!
....
> double s = 1.0/77.0;
...
> for (int i = 1; i <= n; ++i)
> {
> System.out.print(s + " x ");
>
> double r = 78.0 * s - 1;
> s = r;
>
> }
....


"Deve" è una parola forte. Meglio dire:
dovrebbe dare lo stesso valore SE l'aritmetica floating point dei
computer fosse la stessa dei razionali della matematica.

Ma non è così.

Benvenuto nel mondo dei floating point con un numero limitato di bit!

1.0/77.0 non è rappresentabile esattamente con un numero finito di cifre
binarie. Ergo, la rappresentazione binaria introduce un'approssimazione
a livello delle ultime cifre sgnificative che la tua successione
amplifica rapidamente.

Per saperne di più:
https://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

Giorgio

PS il tutto è indipendente dal linguaggio!



rootkit

unread,
Sep 20, 2020, 8:20:43 AM9/20/20
to
Il giorno mercoledì 9 settembre 2020 alle 02:36:05 UTC+2 trippone...@gmail.com ha scritto:
> Questa successione numerica definita per ricorrenza deve dare ovviamente sempre lo stesso valore per ogni termine ( cioè sempre 1/77) , invece da tutti valori diversi!

per integrare la risposta che ti è già stata data: il problema nasce dal fatto che non tutti i numeri reali razionali sono rappresentabili in base binaria, per cui il computer nel rappresentarli ricorre ad una approssimazione al numero più vicino rappresentabile e da qui le differenze.

la cosa però in teoria non dovrebbe sorprendere: anche in base decimale non tutti i numeri razionali sono rappresentabili, infatti se fai 1/3 + 1/3 + 1/3 non otterrai esattamente 1 proprio in virtù di questo problema.

solo che per i calcoli in decimale siamo intrinsecamente consapevoli di questo problema e usiamo nei calcoli un concetto che si chiama "precisione". ogni numero razionale che rappresentiamo in decimale sappiamo che non è esatto ma che ha una precisione, rappresentata da un certo numero di cifre dopo la virgola.

in java esistono i BigDecimal adatti allo scopo. oltre a rappresentare i numeri in base decimale e non binaria consentono di fissare la precisione.
0 new messages