Calcolo in virgola mobile

Torno con un altro problema, sperando nella disponibilità di voi esperti.
Ho misurato tre angoli A,B,C e li ho sommati per confrontarli.
if (A+C)==B:
dosomething()
if (B+C)==A:
dosomething()
Una sola e almeno una delle due è per forza corretta.
A volte però non è valida nessuna delle due a causa dell’arrotondamento (credo) e cioè:
A=10,123456
B=15,246911
C=5,123456
Come vedete l’ultimo decimale di B è una unità indietro alla somma di A+C.
Spero di essere stato chiaro.
Come posso risolvere o aggirare il problema?

usa la else:

if (A+C)==B:
 dosomething()
else (B+C)==A:
 dosomething()

se… altrimenti…
Chiaro che in questo modo eseguirà sempre la prima parte a discapito della seconda.
sennò devi mettere un altro controllo (if) all’interno della prima verifica

Non vedo corretta la soluzione perchè, se nel primo if compare l’errore sopracitato e quindi lo salta, quando invece la risposta è vera, non deve risolvere la seconda, ma al massimo darmi un errore che nessuna delle due è vera!

Devi inserire un controllo con una tolleranza…
Le cose sono due:

  1. parti facendo l’arrotondamento dei valori alla terza o quarta cifra dopo lo zero così sei sicuro di non incappare in errori di arrotondamento

  2. metti la condizione

If -0.000002<(A+C-B)<0.000002
Do_something
ElseIf -0.000002<(B+C-A)<0.000002
Do_naltra_roba

così da considerare entro quale tolleranza accettare una delle due affermazioni.

Andrei giù duro con la lima…
Round(A,3)
e anche B e C…

D, E e F… e anche G ormai che ci siamo…

Non sono riuscito con nessuno dei suggerimenti.
Ho addirittura provato a fare:

if str(int(B+C-A))=="0"
fanaroba()
if str(int(A+C-B))=="0"
fanaltraroba()

Ma sono dovuto passare a convertire il secondo if in else e casualmente funziona tutto perfettamente.
Continuo a non capire il motivo per cui solo il secondo if non riesce a valutarlo!

Credo che funzioni con Else perché, non essendo valida la prima condizione, esegue la seconda senza valutare A+C-B
Quando esegui il Round del valore, fai un controllo con un Rhino.print per vedere come viene arrotondato?

Ho sempre controllato gli output proprio per capire cosa c’era che non andava.
A un certo punto ho anche visto che non mi accettava variabili E e F…
Sono troppo giovane nell’argomento e forse sto correndo troppo?

Ciao Federico,

se vuoi, prova con queste istruzioni e dicci che output ti da’ … grazie.

print 'A = ' + str( A )
print 'B = ' + str( B )
print 'C = ' + str( C )
if abs( A + C - B ) < 0.01:
    print 'A + C = B'
elif abs( B + C - A ) < 0.01:
    print 'B + C = A'
else:
    print 'Gli angoli non combinano ...'

Ciao !

Emilio sei un genio!
Mi è bastato mettere abs(A+C-B) < 0.01 anzichè (A+C-B)==0 e tutto funziona perfettamente!

Grazie

E’ quello che ti hanno suggerito anche gli altri.
Credo che prima tu abbia solo avuto qualche difficolta’ ad applicare la cosa … :smiley:
Ciao !