La precisione e la realtà

s-p

Ogni tanto qualcuno riporta una variante di come il ‘puter sbaglia clamorosamente su cose semplicissimissime. Per esempio ecco Vanessa (rockz! 💥, vorei essere come lei (anche se non sono invidioso per natura, nèh!)): […] the people that make fun of JS for 0.1 + 0.2 ≠ 0.3.

Uh! a me fa venire in mente due cose. Comincio con la verifica

$ python3 -q
>>> 0.1 + 0.2
0.30000000000000004
>>>
$ node
> 0.1 + 0.2
0.30000000000000004
$ racket
Welcome to Racket v6.11.
> (+ 0.1 0.2)
0.30000000000000004
> ;; ma anche
  (+ 1/10 2/10)
3/10
> ;; e
  (exact->inexact (+ 1/10 2/10))
0.3
$ echo "0.1 + 0.2" | bc
.3
$ calc 0.1 + 0.2
	0.3
$ maxima -q
(%i1) 0.1 + 0.2;
(%o1)                                 0.3

OK, Racket rockz! 💥, come già si sapeva. Ma gli interpretati dinamicamente come JavaScript, Python e altri ancora, da me non usati correntemente, fanno proprio come dice Vanessa (et al.).

Non è solo una stravaganza della REPL, è davvero vero:

$ python3 -q
>>> (0.1 + 0.2) == 0.3
False
>>> round((0.1 + 0.2), 3) == 0.3
True

Non è una cosa nuova, anzi –qui entro nel c’era una volta– io che sono vecchio ricordo che fin da quando ho cominciato c’erano due funzioni (nostre, cioè fatte da uno di noi o prese da qualche guru nostrano (o anche no)): LEQR e LEQD, rispettivamente per argomenti REAL (4 bytes) e DOUBLE PRECISION (8 bytes); da dichiarare LOGICAL. Con Python diventano una sola, qeq (sta per quasi-equal):

def qeq(a, b):
    return abs(a - b) < 1e-15

Da provare:

$ py3
>>> def qeq(a, b):
...     return abs(a - b) < 1e-15 
... 
>>> qeq(0.1 + 0.2, 0.3)
True
>>> from math import pi
>>> qeq(22/7, pi)
False
>>> #difatti
>>> 22/7 - pi
0.0012644892673496777

Ma se devo dire tutta la verità questa funzione (nelle due varianti) non veniva usata: era lunga una sola riga quindi niente risparmio di battute per contro l’uso comportava un carico maggiore per il sistema, la chiamata a funzione. Volendo potrei raccontare dello statement function, ecco l’inizio di pag. 7-7 del manuale del Fortran IV di Pr1me:

st-fun

Anch’io so cose lollose come Vanessa, solo di utilità assolutamente nulla (oggi, come passa il tempo!).

H/T a AP che mi ha corretto la bozza. E i suggerimenti.

Posta un commento o usa questo indirizzo per il trackback.

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d blogger hanno fatto clic su Mi Piace per questo: