Ciclo while python

> 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

Si’

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 :man_facepalming:

non lo so ma all’epoca che iniziai a fare i primi codici anni fa non ricordo queste problematiche :thinking:
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ò :sweat_smile:

Ciao Salvio

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.

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

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

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.

Certo. :grinning:
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 !=.

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 :desktop_computer:

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

ciao Sergio,

si infatti con i numeri interi il problema non si presenta :+1:

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?

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

1 Mi Piace

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