Risolto Bug di Python , o problema mio? (sicuramente mio)

Bravo007

Utente Iron
31 Dicembre 2021
2
1
0
4
Ultima modifica da un moderatore:
Ciao ragazzi,
ho scritto un codice con Python3 che calcola solo le radici reali di un equazione di secondo grado con una variabile.
Roba facile, bastano poche righe.
Però non mi torna il risultato quando faccio la prova, cioè quando metto le radici trovati nell'equazione
In seguito vi scrivo il codice completo
Python:
from math import sqrt  # importo sqrt dalla libreria math

a=float(input('Inserisci il valore di \"a\" '))  # Prende il valore di a
b=float(input('Inserisci il valore di \"b\" '))  # Prende il valore di b
c=float(input('Inserisci il valore di \"c\" '))  # Prende il valore di c
delta = b**2 - 4*a*c         # calcola il discriminante

if delta > 0:                                           # se delta>0
    x1 = (-b - sqrt(delta)) / (2 * a)      # cacola la radice
    x2 = (-b + sqrt(delta))/ (2 * a)      # calcola la radice

    print('L\'equazione ha due soluzioni reali')  # stampa questo
    print('x1 = ',x1,'\nx2 = ',x2)   # stampa x1 e x2
    prova = a*x1**2 +b*x1 +c
    prova1 = a * x2 ** 2 + b * x2 + c
    print('Prova di x1 = ',prova)
    print('Prova di x2 = ',prova1)
elif delta == 0:                                    # solo se la condizione di 'if' non viene soddisfata fai elif
    x1 = (-b - sqrt(delta)) / (2 * a)
    print('L\'equazione ha due soluzioni coencidenti')  # stampa questo
    print('x1=x2= ',x1)                                 # stampa
else:                                      # solo se 'if' e 'elif' non vengono sodisfati fai il blocco else
    print('Non esistono soluzioni reali')          # stampa questo

OUTPUT

Inserisci il valore di "a" 5 #valore di input
Inserisci il valore di "b" -2 #valore di input
Inserisci il valore di "c" -16 #valore di input
L'equazione ha due soluzioni reali
x1 = -1.6
x2 = 2.0
Prova di x1 = 3.552713678800501e-15 # questo nn mi torna, dovrebbe essere 0
Prova di x2 = 0.0

Sicuramente ho sbagliato nel scrivere il risultato di prova, ma non riesco a capire
in modo specifico
 
Ultima modifica:
È tutto corretto. Il problema è che i computer tipicamente usano una notazione in virgola mobile per fare calcoli su numeri decimali. La notazione che usano si chiama IEE754 e non riesce a rappresentare in modo esatto alcuni numeri tra cui 1.6, che può essere rappresentato (approssimativamente) con 1.60000000000000008882 oppure con 1.59999999999999986677. Il risultato che leggi, tolta la notazione scientifica, è 0.00000000000000355271 che è approssimativamente 0: non è esattamente 0 perché il computer non ha potuto usare esattamente 1.6.

Per stampare tutti i valori in virgola mobile, usa una cosa del tipo:
Python:
print('{:.5g}'.format(variabile))
almeno ti limiti ad una precisione di 5 cifre decimali e vedi i risultati che ti aspetti.

PS. Quando posti il codice usa il tag CODE. Lo trovi nella barra in alto nella casella dove scrivi il messaggio e supporta anche il syntax highlighting.
 
Grazie mille, stavo per impazzire.
Ho provato a farlo in questo modo e va alla grande!

Python:
prova = a * x1 ** 2 + b * x1 + c
    prova1 = a * x2 ** 2 + b * x2 + c
    print('Prova di x1 = ','%.2f' % (prova))
    print('Prova di x2 = ','%.2f' % (prova1))

PS. Sono nuovo qui e non sapevo che esistessero questi tool, grazie per avermelo spiegato.