Forum: Italian Ruby user group Numeri float

F982b8c5b35e9639efe247d9812fc19d?d=identicon&s=25 Renato Lenzi (renoir)
on 2013-08-10 15:18
Non mi è particolarmente chiaro il discorso alle differenze tra i numeri
floating point calcolati e non.
Ovvero:
1.9 è un numero e ci siamo
1.8 + 0.1 è diverso

irb(main):023:0> 1.8 + 0.1
=> 1.9000000000000001

e va bene
Su un testo leggo la seguente frase condita da esempio:

Note that the difference between the two numbers
is preciselyFloat::EPSILON:
Float::EPSILON # => 2.22044604925031e-16
(1.8 + 0.1) - 1.9 # => 2.22044604925031e-16

però se prendo altri numeri la cosa cambia:

irb(main):020:0> (2.2 + 0.1) - 2.3
=> 4.440892098500626e-16
irb(main):021:0> (42.2 + 0.1) -42.3
=> 7.105427357601002e-15

Insomma, senza passare di lenti BigDecimal, qual è la strada migliore
per verificare l'uguaglianza tra
2.2 + 0.1 e 2.3?

Grazie in anticipo.
F8990e1991980f60be9ab371a214a21d?d=identicon&s=25 Federico Ravasio (razielgn)
on 2013-08-10 15:28
(Received via mailing list)
On Saturday, August 10, 2013 at 3:18 PM, Renato Lenzi wrote:
> Su un testo leggo la seguente frase condita da esempio:
> irb(main):021:0> (42.2 + 0.1) -42.3
> _______________________________________________
> Ml mailing list
> Ml@lists.ruby-it.org (mailto:Ml@lists.ruby-it.org)
> http://lists.ruby-it.org/mailman/listinfo/ml

Sia minitest che rspec usano metodi simili tra loro: controllare che il
valore sia in un range ristretto, denominato delta:
Minitest:
http://www.ruby-doc.org/stdlib-1.9.3/libdoc/minite...
Rspec:
https://www.relishapp.com/rspec/rspec-expectations...

Federico
Ea11f27a9b96fffde96cebc912a3bcc4?d=identicon&s=25 Daniele Palombo (Guest)
on 2013-08-10 18:32
(Received via mailing list)
Ciao ,
Non basterebbe la funzione round per effettuare la comparazione ?

http://www.ruby-doc.org/core-1.9.3/Float.html#method-i-round

(2.2 + 0.1).round(2) == 2.3.round(2)

Daniele.


Il giorno 10 agosto 2013 15:27, Federico Ravasio
<ravasio.federico@gmail.com
> ha scritto:
F982b8c5b35e9639efe247d9812fc19d?d=identicon&s=25 Renato Lenzi (renoir)
on 2013-08-10 23:27
Per ora me la sono cavata con una porcheria di questo tipo:


irb(main):019:0> ((2.2 + 0.1) - 2.3).abs < 0.00000000001
=> true

non un gran che....
026366050dc3c6d63de343d0e8ea8daa?d=identicon&s=25 Alessio Rocco (alessio_rocco)
on 2013-08-14 00:17
All'Euruko di questo anno Xavier Noria ha fatto un talk su questo tipo
di problemi, se vuoi trovi il video e le slide del video a questo
indirizzo http://euruko2013.org/#videos.
Forse può toglierti qualche dubbio e darti qualche idea.
4c8f1734faea8b7b2db0ea4bf4ebbf66?d=identicon&s=25 Matteo Vaccari (Guest)
on 2013-08-29 09:51
(Received via mailing list)
Il problema  che 0.1 non ha una rappresentazione binaria finita;
analogamente a 1/3 che non ha una rappresentazione decimale finita.

L'unica maniera corretta in generale di verificare l'uguaglianza fra
numeri
in virgola mobile  a meno di un piccolo delta, come giustamente ha
scritto
Federico.  Si verifica cio che sia

abs(x-y) < epsilon



2013/8/10 Renato Lenzi <rexlen@gmail.com>
Please log in before posting. Registration is free and takes only a minute.
Existing account

NEW: Do you have a Google/GoogleMail, Yahoo or Facebook account? No registration required!
Log in with Google account | Log in with Yahoo account | Log in with Facebook account
No account? Register here.