# Ciclo while python

**URL:** <https://it.discourse.mcneel.com/t/ciclo-while-python/3704>\
**Category:** Scripting e Programmazione\
**Created:** [10 Gennaio 2021, 6:45am UTC](https://it.discourse.mcneel.com/t/ciclo-while-python/3704 "2021-01-10T06:45:45Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![0904](https://avatars.discourse-cdn.com/v4/letter/0/b3f665/32.png) [@0904](https://it.discourse.mcneel.com/u/0904)\
**Post date:** [10 Gennaio 2021, 6:45am UTC](https://it.discourse.mcneel.com/t/ciclo-while-python/3704/1 "2021-01-10T06:45:45Z")

</div>

```
> e = 0.0
> while e <= 0.100:
> print e
> e += 0.001
> if e == 0.099: print "ok"

```

come mai, non mi stampa “ok”? è sempre il famoso problema di precisione o arrotondamento?

edit: strano se metto “\>” 0.098 al posto di “==” 0.099 funziona

---

<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:** [10 Gennaio 2021, 9:00am UTC](https://it.discourse.mcneel.com/t/ciclo-while-python/3704/2 "2021-01-10T09:00:33Z")

</div>

> [@0904](#):
>
> è sempre il famoso problema di precisione o arrotondamento?

Si’

> [@0904](#):
>
> strano

Perche’ ?

---

<div class="post-metadata">

**Author:** ![0904](https://avatars.discourse-cdn.com/v4/letter/0/b3f665/32.png) [@0904](https://it.discourse.mcneel.com/u/0904)\
**Post date:** [10 Gennaio 2021, 1:46pm UTC](https://it.discourse.mcneel.com/t/ciclo-while-python/3704/3 "2021-01-10T13:46:24Z")

</div>

> [@emilio](#):
>
> Perche’ ?

ciao Emilio,  
questa volta il valore non’ è importato o preso chissà da quale calcolo o lunghezza di geometria  
imposto un valore 0.0 incremento di 0.001 se arriva a 0.100 condizione True esegui codice 🤦‍♂️

non lo so ma all’epoca che iniziai a fare i primi codici anni fa non ricordo queste problematiche 🤔  
mah forse dipende che sto usando python in Gh, anche se i parametri essendo specifici non dovrebbe.

grazie per la conferma, cerco di trovare i suggerimenti dei vecchi post nel caso ti disturbo un pò 😅

---

<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:** [10 Gennaio 2021, 2:09pm UTC](https://it.discourse.mcneel.com/t/ciclo-while-python/3704/4 "2021-01-10T14:09:19Z")

</div>

Ciao Salvio

> [@0904](#):
>
> non’ è importato o preso chissà da quale calcolo

Non e’ questione di errori nel valore iniziale.  
E’ un limite intrinseco dei numeri floating point usati dai computer.  
Certi valori (decimali) non possono essere rappresentati esattamente (in binario).

Se vuoi prova questo e vedi cosa scrive.

```python
e = 0.0
while e <= 0.100:
# print e
    e += 0.001
    print 'E = %.16f' % e
    if e == 0.099: print "ok"
print '0.099 = %.16f' % 0.099

```

---

<div class="post-metadata">

**Author:** ![0904](https://avatars.discourse-cdn.com/v4/letter/0/b3f665/32.png) [@0904](https://it.discourse.mcneel.com/u/0904)\
**Post date:** [10 Gennaio 2021, 2:38pm UTC](https://it.discourse.mcneel.com/t/ciclo-while-python/3704/5 "2021-01-10T14:38:47Z")

</div>

Emilio ho provato, l’ho avevo capito il senso, ricordo tutte le risposte datemi da tutti voi sul fatto di tutte le cifre decimali che ci sono nei valori e sono diversi soprattutto in Gh dove chi ne usa 12 chi 16 etc  
non credevo che anche se impostavo io i valori avrei riscontrato lo stesso problema

> [@emilio](#):
>
> Certi valori (decimali) non possono essere rappresentati esattamente (in binario).

quindi anche un semplice incremento si deve confrontare con questa “conversione” decimali/binario

ora che ci penso bene, i decimali non ho avuto “credo quasi mai” la necessità di usarli (per fortuna)

usando anche round il risultato non mi cambia, alla fine sempre per il discorso di approssimazione  
credo che sono obbligato ad usare al posto di uguale, l’operatore maggiore in questo modo funziona.

---

<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:** [10 Gennaio 2021, 3:16pm UTC](https://it.discourse.mcneel.com/t/ciclo-while-python/3704/6 "2021-01-10T15:16:56Z")

</div>

> [@0904](#):
>
> l’operatore maggiore in questo modo funziona.

Certo. 😀  
La ‘regola’ quando usi i valori floating point e’: se due valori non sono interi, e’ meglio non verificare se siano uguali o diversi, ma piuttosto usare gli altri confronti cioe’ in Python usare \< , \> , \>= e \<= , ma non == o !=.

---

<div class="post-metadata">

**Author:** ![0904](https://avatars.discourse-cdn.com/v4/letter/0/b3f665/32.png) [@0904](https://it.discourse.mcneel.com/u/0904)\
**Post date:** [10 Gennaio 2021, 3:50pm UTC](https://it.discourse.mcneel.com/t/ciclo-while-python/3704/7 "2021-01-10T15:50:07Z")

</div>

eeee Emilio, appunto come edit nel primo post che avevo provato  
oppure anche avevo cambiato il valore per il confronto ed in certi casi == funziona  
quindi come ribadivi, la conversione in binario certevolte non tornano numeri precisi

un’altra regola che non conoscevo, e che ho dovuto imparare facendo esperienza 🖥

---

<div class="post-metadata">

**Author:** ![Sergio\_Alessi](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/sergio_alessi/32/22676_2.png) [@Sergio\_Alessi](https://it.discourse.mcneel.com/u/Sergio_Alessi)\
**Post date:** [10 Gennaio 2021, 10:51pm UTC](https://it.discourse.mcneel.com/t/ciclo-while-python/3704/8 "2021-01-10T22:51:11Z")

</div>

Se la variabile fosse un intero non ci sarebbe questo problema. Purtroppo non definendo il tipo di dato c’è questo limite.

---

<div class="post-metadata">

**Author:** ![0904](https://avatars.discourse-cdn.com/v4/letter/0/b3f665/32.png) [@0904](https://it.discourse.mcneel.com/u/0904)\
**Post date:** [10 Gennaio 2021, 11:46pm UTC](https://it.discourse.mcneel.com/t/ciclo-while-python/3704/9 "2021-01-10T23:46:46Z")

</div>

ciao Sergio,

> [@Sergio\_Alessi](#):
>
> Se la variabile fosse un intero non ci sarebbe questo problema.

si infatti con i numeri interi il problema non si presenta 👍

mentre coi decimali si è obbligati ad usare float(“%0.3f” % (0.099)) oppure il round(0.099, 3) più pratico

ma la regola della conversione in binario vale solo per python oppure anche per i vecchi linguaggi vb?

---

<div class="post-metadata">

**Author:** ![Sergio\_Alessi](https://sea3.discourse-cdn.com/mcneel/user_avatar/it.discourse.mcneel.com/sergio_alessi/32/22676_2.png) [@Sergio\_Alessi](https://it.discourse.mcneel.com/u/Sergio_Alessi)\
**Post date:** [11 Gennaio 2021, 6:47am UTC](https://it.discourse.mcneel.com/t/ciclo-while-python/3704/10 "2021-01-11T06:47:38Z")

</div>

E’ un problema delle variabili float.  
Di solito si usa abs(differenza)\<tolleranza.

---

<div class="post-metadata">

**Author:** ![0904](https://avatars.discourse-cdn.com/v4/letter/0/b3f665/32.png) [@0904](https://it.discourse.mcneel.com/u/0904)\
**Post date:** [11 Gennaio 2021, 5:48pm UTC](https://it.discourse.mcneel.com/t/ciclo-while-python/3704/11 "2021-01-11T17:48:03Z")

</div>

grazie Sergio, per la precisazione sul float e per il suggerimento (ri)proposto assimilato finalmente 👍
