# Calcolo in virgola mobile

**URL:** <https://it.discourse.mcneel.com/t/calcolo-in-virgola-mobile/577>\
**Category:** Scripting e Programmazione\
**Created:** [13 Maggio 2015, 9:00am UTC](https://it.discourse.mcneel.com/t/calcolo-in-virgola-mobile/577 "2015-05-13T09:00:58Z")\
**Posts on this page:** 12\
**Page:** 1

<div class="post-metadata">

**Author:** ![fferraro\_78](https://avatars.discourse-cdn.com/v4/letter/f/439d5e/32.png) [@fferraro\_78](https://it.discourse.mcneel.com/u/fferraro_78)\
**Post date:** [13 Maggio 2015, 9:00am UTC](https://it.discourse.mcneel.com/t/calcolo-in-virgola-mobile/577/1 "2015-05-13T09:00:58Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![Riccardo\_Gatti](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/riccardo_gatti/32/22929_2.png) [@Riccardo\_Gatti](https://it.discourse.mcneel.com/u/Riccardo_Gatti)\
**Post date:** [13 Maggio 2015, 9:12am UTC](https://it.discourse.mcneel.com/t/calcolo-in-virgola-mobile/577/2 "2015-05-13T09:12:16Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![fferraro\_78](https://avatars.discourse-cdn.com/v4/letter/f/439d5e/32.png) [@fferraro\_78](https://it.discourse.mcneel.com/u/fferraro_78)\
**Post date:** [13 Maggio 2015, 9:35am UTC](https://it.discourse.mcneel.com/t/calcolo-in-virgola-mobile/577/3 "2015-05-13T09:35:23Z")

</div>

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!

---

<div class="post-metadata">

**Author:** ![lucio\_zadra](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/lucio_zadra/32/16361_2.png) [@lucio\_zadra](https://it.discourse.mcneel.com/u/lucio_zadra)\
**Post date:** [13 Maggio 2015, 1:54pm UTC](https://it.discourse.mcneel.com/t/calcolo-in-virgola-mobile/577/4 "2015-05-13T13:54:08Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![giuseppe](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/giuseppe/32/16416_2.png) [@giuseppe](https://it.discourse.mcneel.com/u/giuseppe)\
**Post date:** [13 Maggio 2015, 4:42pm UTC](https://it.discourse.mcneel.com/t/calcolo-in-virgola-mobile/577/5 "2015-05-13T16:42:03Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![lucio\_zadra](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/lucio_zadra/32/16361_2.png) [@lucio\_zadra](https://it.discourse.mcneel.com/u/lucio_zadra)\
**Post date:** [13 Maggio 2015, 6:11pm UTC](https://it.discourse.mcneel.com/t/calcolo-in-virgola-mobile/577/6 "2015-05-13T18:11:40Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![fferraro\_78](https://avatars.discourse-cdn.com/v4/letter/f/439d5e/32.png) [@fferraro\_78](https://it.discourse.mcneel.com/u/fferraro_78)\
**Post date:** [14 Maggio 2015, 10:21pm UTC](https://it.discourse.mcneel.com/t/calcolo-in-virgola-mobile/577/7 "2015-05-14T22:21:23Z")

</div>

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!

---

<div class="post-metadata">

**Author:** ![lucio\_zadra](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/lucio_zadra/32/16361_2.png) [@lucio\_zadra](https://it.discourse.mcneel.com/u/lucio_zadra)\
**Post date:** [15 Maggio 2015, 7:17am UTC](https://it.discourse.mcneel.com/t/calcolo-in-virgola-mobile/577/8 "2015-05-15T07:17:19Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![fferraro\_78](https://avatars.discourse-cdn.com/v4/letter/f/439d5e/32.png) [@fferraro\_78](https://it.discourse.mcneel.com/u/fferraro_78)\
**Post date:** [15 Maggio 2015, 11:17am UTC](https://it.discourse.mcneel.com/t/calcolo-in-virgola-mobile/577/9 "2015-05-15T11:17:44Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![emilio](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/emilio/32/16095_2.png) [@emilio](https://it.discourse.mcneel.com/u/emilio)\
**Post date:** [15 Maggio 2015, 10:10pm UTC](https://it.discourse.mcneel.com/t/calcolo-in-virgola-mobile/577/10 "2015-05-15T22:10:21Z")

</div>

Ciao Federico,

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

```python
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 !

---

<div class="post-metadata">

**Author:** ![fferraro\_78](https://avatars.discourse-cdn.com/v4/letter/f/439d5e/32.png) [@fferraro\_78](https://it.discourse.mcneel.com/u/fferraro_78)\
**Post date:** [16 Maggio 2015, 2:46pm UTC](https://it.discourse.mcneel.com/t/calcolo-in-virgola-mobile/577/11 "2015-05-16T14:46:11Z")

</div>

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

Grazie

---

<div class="post-metadata">

**Author:** ![emilio](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/emilio/32/16095_2.png) [@emilio](https://it.discourse.mcneel.com/u/emilio)\
**Post date:** [16 Maggio 2015, 6:46pm UTC](https://it.discourse.mcneel.com/t/calcolo-in-virgola-mobile/577/12 "2015-05-16T18:46:56Z")

</div>

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