Perché ottimi programmi commettono questo errore?

Il forum di Base5, dove è possibile postare problemi, quiz, indovinelli, rompicapo, enigmi e quant'altro riguardi la matematica ricreativa e oltre.

Moderatori: Gianfranco, Bruno

Rispondi
Gianfranco
Supervisore del sito
Supervisore del sito
Messaggi: 1720
Iscritto il: ven mag 20, 2005 9:51 pm
Località: Sestri Levante
Contatta:

Perché ottimi programmi commettono questo errore?

Messaggio da Gianfranco »

Cari amici,
siete tutti d'accordo che, per qualunque a e qualunque b<>0:

$\Large \frac{((a + b)^2 - (a^2 + 2ab))}{b^2}=1$

?

Ho provato a fare questo calcolo con Maxima e poi con Mathematica online e "escono" i seguenti risultati (errati).
Come lo spiegate?
wolfram1_1.jpg
wolfram1_1.jpg (31.61 KiB) Visto 7779 volte
wolfram1_2.jpg
wolfram1_2.jpg (32.92 KiB) Visto 7779 volte
Pace e bene a tutti.
Gianfranco

panurgo
Livello 9
Livello 9
Messaggi: 1521
Iscritto il: sab nov 19, 2005 3:45 pm
Località: Padova

Re: Perché ottimi programmi commettono questo errore?

Messaggio da panurgo »

L'introduzione di numeri in formato decimale ($b=1./a$ in figura) invoca l'uso dell'aritmetica approssimata
OttimiErrori.001.png
OttimiErrori.001.png (48.97 KiB) Visto 7738 volte
La formula proposta è particolarmente soggetta agli errori di arrotondamento: dovrebbe essere

$\left(a+b\right)^2-\left(a^2+2ab\right)=1000002.000001-1000002=0.000001$

ma il risultato invece $0.00000100001$ perché la rappresentazione in virgola mobile non è esatta.

Possiamo aumentare la precisione del calcolo aggiungendo zeri dopo la virgola
OttimiErrori.002.png
OttimiErrori.002.png (48.91 KiB) Visto 7738 volte
fino a che, con dieci zeri, questa diventa sufficiente a differenziare $0.000001$ da $0.00000100001$
OttimiErrori.003.png
OttimiErrori.003.png (53.05 KiB) Visto 7738 volte
Lo stesso vale per il secondo errore: con nove zeri
OttimiErrori.004.png
OttimiErrori.004.png (52.22 KiB) Visto 7738 volte
con dieci zeri
OttimiErrori.005.png
OttimiErrori.005.png (53.15 KiB) Visto 7738 volte
Inutile dire che se invochiamo l'aritmetica esatta ($b=1/a$) il problema non si pone
OttimiErrori.006.png
OttimiErrori.006.png (51.46 KiB) Visto 7738 volte
come non si pone per l'algebra simbolica
OttimiErrori.007.png
OttimiErrori.007.png (45.58 KiB) Visto 7738 volte
il panurgo

Principio di Relatività: $\mathbb{m} \not \to \mathbb{M} \, \Longleftrightarrow \, \mathbb{M} \not \to \mathbb{m}$
"Se la montagna non va a Maometto, Maometto NON va alla montagna"

Gianfranco
Supervisore del sito
Supervisore del sito
Messaggi: 1720
Iscritto il: ven mag 20, 2005 9:51 pm
Località: Sestri Levante
Contatta:

Re: Perché ottimi programmi commettono questo errore?

Messaggio da Gianfranco »

Grazie Panurgo!
Sapevo che risolvendo l'espressione letterale in forma simbolica questi programmi danno come risultato 1.
Ma non conoscevo bene il motivo di quegli errori quando eseguono il calcolo in forma numerica con particolari valori delle lettere.
Forse la cosa che mi ha stupito è questa: se un programma "sa potenzialmente" che il risultato di un'espressione (letterale) è sempre 1 (tranne casi estremi), perché dice che fa 0? Non potrebbe invece usare un po' di intelligenza in questi casi?

Ho provato a porre la stessa domanda alla chat di Bing (che forse si basa su chat gpt) e insiste a rispondere che il risultato è 1 senza neppure degnarsi di sostituire le variabili.
Ma forse neppure questo è un comportamento "intelligente".
Pace e bene a tutti.
Gianfranco

Quelo
Livello 7
Livello 7
Messaggi: 902
Iscritto il: ven giu 16, 2006 3:34 pm

Re: Perché ottimi programmi commettono questo errore?

Messaggio da Quelo »

Io so che alcuni linguaggi di programmazione (come ad esempio Python) eseguono i calcoli in binario, per cui quando gli si forniscono variabili in base 10, la doppia conversione introduce degli errori.
Questo non accade se ad esempio le varibili sono potenze di 2.

Errori 002.png
Errori 002.png (18.88 KiB) Visto 7670 volte

Potrebbe essere lo stesso anche per altri software?

Errori 001.png
Errori 001.png (95.45 KiB) Visto 7670 volte
[Sergio] / $17$

Rispondi