Risolvi l'equazione  x2 − 105·x + 1 = 0  arrotondando le, eventuali, soluzioni ad 11 cifre.

Sia F(x) = x2 − 105·x + 1. L'equazione F(x) = 0 ha sicuramente soluzioni in quanto F è continua, il suo grafico è una parabola con la concavità rivolta verso l'alto che ha dei punti al di sotto dell'asse delle ascisse: ad esempio F(1) < 0.
Provo a risolvere l'equazione usando la "formula risolutiva per le equazioni di 2º grado":
a*x²+b*x+c=0,  (-b+sqrt(b^2-4*a*c))/(2*a), (-b-sqrt(b^2-4*a*c))/(2*a); a = c = 1, b = -1e5

Usiamo una calcolatrice efficiente, come questa, mettendo l'input dove indica la freccia:

(1e5+sqrt(-1e5*-1e5-4*1*1))/2 = 99999.99999
(1e5-sqrt(-1e5*-1e5-4*1*1))/2 = 0.000010000003385357559

Usando uno script che incopora la formula risolutiva come questo otterrei un esito analogo:

Vediamo se x2 − 105·x + 1 vale effettivamente 0 assegnando a x questi valori:

99999.99999*99999.99999 + (-1e5)*99999.99999 + 1 = 0
0.000010000003385357559*0.000010000003385357559+(-1e5)*0.000010000003385357559+1 = -3.384357558644524e-7

In un caso non ottengo 0; con una calcolatrice meno effciente non avrei ottenuto 0 neanche nell'altro caso. Come mai?

Proviamo a trovare la seconda soluzione in un modo più efficiente, usando un metodo numerico (analogo a quello di bisezione), incorporato in questo script:


p = 1     q = -1e5     u = 1
a = 0     b = 1
. . .
a = 0.000010000000000999998    b = 0.000010000000001

0.000010000000001000000 è la soluzione arrotondata della equazione. Verifichiamola con la calcolatrice:

0.000010000000001*0.000010000000001+(-1e5)*0.000010000000001+1 = 0

OK!

Verifichiamo la cosa anche con WolframAlpha battendo  solve x^2-10^5*x+1=0 for x. Otteniamo i seguenti valori, che arrotondati a 17 cifre sono in accordo con le uscite precedenti.
x = 0.00001000000000100000000020000000005000…   x = 99999.99998999999999899999999980000…

Come mai questo fenomeno? L'uso di un metodo numerico dà approssimazioni migliori in quanto usando invece la cosiddetta formula risolutiva ci si trova di fronte al calcolo di  (105 − √(1010 − 4)) / 2  e  √(1010 − 4)  è circa 99999.999980, per cui si tratta della differenza (tra 100000 e questo valore) di due numeri quasi uguali, con risultato (pari circa a 2·10−5) di ordine di grandezza molto più piccolo. Il risultato ha quindi molto meno cifre significative.  Ecco come dovremmo modificare l'espressione per ottenere una buona approssimazione:
(105 − √(1010 − 4)) / 2 =
(105 − √(1010 − 4))(105 + √(1010 − 4)) / (2(105 + √(1010 − 4))) =
(1010 − 1010 + 4) / (2(105 + √(1010 − 4))) =
2 / (105 + √(1010 − 4))
Utilizzando questo termine troveremmo una approssimazione confrontabile con quella della soluzione ottenuta algoritmicamente:

0.000010000000001*0.000010000000001+(-1e5)*0.000010000000001+1 = 0
2 / (1e5 + sqrt(1e10-4)) = 0.000010000000001000001