Radici equazionione di secondo grado

tetravalenza
Ho trovato questo interessante algoritmo che calcola le radici delle equazioni di secondo grado

discriminant := b*b - 4*a*c
discr_root   := sqrt(discriminant)
factor       := - b - sign(b)*discr_root
r1           := factor / (2*a)
r2           := (2*c) / factor
return (r1, r2)


Purtroppo mi sfugge il significato di quel \(sign(b)\), cosa dovrebbe fare?

Risposte
apatriarca
Quando \(4ac \approx 0,\) il discriminante \(\sqrt{b^2 - 4ac} \approx b\). Una delle due somme \(-b + \sqrt{b^2 - 4ac}\) e \(-b - \sqrt{b^2 - 4ac}\) è quindi potenzialmente soggetta a cancellazione distruttiva. In particolare, se \(b\) è positiva allora si ha cancellazione con \(+\) e quando \(b\) è negativa si ha cancellazione con \(-\).

L'idea è quindi quella di usare una espressione diversa in questo caso. Siccome
\[ \frac{-b \pm \sqrt{b^2 - 4ac}}{2a} \frac{-b \mp \sqrt{b^2 - 4ac}}{-b \mp \sqrt{b^2 - 4ac}} = \frac{2c}{-b \mp \sqrt{b^2 - 4ac}} \]
si può passare da una espressione che presenta cancellazione nell'altra che non lo presenta.

La scelta dipende dal segno di \(b\) ed è la ragione per l'uso di \(\text{sign}(b)\) nel tuo algoritmo.

tetravalenza
Ciao, grazie per il chiarimento.

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