Radici equazionione di secondo grado
Ho trovato questo interessante algoritmo che calcola le radici delle equazioni di secondo grado
Purtroppo mi sfugge il significato di quel \(sign(b)\), cosa dovrebbe fare?
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
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.
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.
Ciao, grazie per il chiarimento.