Precisione

gnu-head-sm
Chi mi conosce sa che sono un vecchio rottame, che ha bisogno spesso di manutenzione. Che vuol dire passare ogni tanto una mattinata nella sala d’attesa di un ospedale facendo la coda per la visita con prelievi vari e poi quella per i risultati e valutazione degli stessi.
E non puoi fare colazione (io un caffè lo prendo comunque) e ti annoi che non ti dico. OK, basta lamentarsi.

L’ultima volta, questa settimana, mi sono premunito: per via di Bit3Lux Luigi mi sono portato dietro il Kindle con il manuale dell’ultima versione di awk.
Non è che l’ho letto tutto; tra l’altro io continuo a pensare che awk serva per cose veloci, lo script dev’essere di poche righe, meglio se una sola, il manuale invece va nel profondo, cose che non si usano più, anzi secondo me non si useranno mai. Ma ho trovato una cosa interessante, adesso la racconto.

Ah! ‘na roba: la gente in attesa è perlopiù molto anziana e si lamenta della salute e si raccontano le malattie loro e dei loro conoscenti, in italiano e dialetti vari, boring, very very boring.
Poi c’è qualche giovane e degli accompagnatori: questi sono tutti alle prese con smartphones (anche iPhone, quelli veri). Chi ha uno di questi aggeggi non riesce a non usarlo, continuamente. E c’è chi appartiene alla categoria dei messaggiatori, twittatori, facebukki e chi a quella dei telefonisti come si usava una volta, in genere urlando. E senti delle cose che ti lasciano perplesso: possibile che devi dare quell’ordine subito, da lì? Oppure la mamma, il marito, l’amica devesapere che sei in attesa da più di due ore e non sai quando ti liberi?
OK, avevo detto che smettevo con le lamentele, adesso awk, davvero.

Appena arrivato a casa ho acceso il ‘puter e ho visto che la versione installata non era quella gnu. Panico? no, sono ricorso al Softare Center di ‘buntu e l’ho installata (e mi ha coperto la vecchia atz!).

In realtà il Software Center non installa l’ultima versione, quella corrente:

gawk --version
GNU Awk 4.1.0, API: 1.0 (GNU MPFR 3.1.0-p3, GNU MP 5.0.2)
Copyright (C) 1989, 1991-2013 Free Software Foundation.

bensì una un po’ più vecchia, questa:

gawk --version
GNU Awk 4.0.1
Copyright (C) 1989, 1991-2012 Free Software Foundation.

vecchia di un anno. E manca proprio della precisione arbitraria (also known as multiple precision or infinite precision) come dice il manuale a p.324.

Per cui il test che avevo in mente lo devo rimandare a una prossima versione (sì, lo so che potrei scaricare il sorgente e compilarlo ma sono pigro).
Ecco (p.329):

BEGIN {
    s = 2.0
    for (i = 1; i <= 7; i++)
    s = s * (s - 1) + 1
    print s
}

awk -f big2.awk
113423713055421845118910464

Err.! Però, aspetta un momentino: c’è, da sempre, bc:

    s = 2.0
    for (i = 1; i <= 7; i++)
        s = s * (s - 1) + 1
    print s

bc -q big2.bc
113423713055421844361000443.0

Esatto!
Poi, personalmente io per queste cose di solito uso calc:

    s = 2.0
    for (i = 1; i <= 7; i++) {
        s = s * (s - 1) + 1
    }
    print s

calc -f big2.calc
113423713055421844361000443

Esatto!, quindi riassumendo:

valore corretto 113,423,713,055,421,844,361,000,443
gawk 4.0.1      113 423 713 055 421 845 118 910 464
                                      ^
bc e calc       113 423 713 055 421 844 361 000 443

Ma, considerazione finale: serve in pratica? Io questi numeri manco so leggerli; per me sarebbe molto meglio usare 1.13e26, anzi –da ing.– 113e24.
E faccio sempre attenzione all’arrotondamento:
1234 -> 1.23e3
5678 -> 5.68e3
su questo non transigo. La precisione 🙂

Posta un commento o usa questo indirizzo per il trackback.

Commenti

  • Orlando  Il 21 settembre 2013 alle 12:18

    Numeri strani (o forse numero?). Ho provato questo codice

    program test
      real :: s=2.0
      do i=1,7
        s=s*(s-1)+1
        write(*,10) s
      end do
    10 format(F30.1)
    end program test
    

    e si ottiene

                               3.0
                               7.0
                              43.0
                            1807.0
                         3263443.0
                  10650057179136.0
     113423716646946804535918592.0
    

    L’ultimo, scritto in cifre da tre è

    valore corretto 113,423,713,055,421,844,361,000,443
    gawk 4.0.1      113 423 713 055 421 845 118 910 464
    bc e calc       113 423 713 055 421 844 361 000 443
    !fortran        113 423 716 646 946 804 535 918 592
    

    Ciao,
    Orlando

    • juhan  Il 21 settembre 2013 alle 12:22

      Mitico, appena ho tempo risposta come meriti.

      • Orlando  Il 21 settembre 2013 alle 12:25

        Anche C++ restituisce 113 423 716 646 946 804 535 918 592.

        Ciao,
        Orlando

Trackback

  • Precisione – 2 | Ok, panico su 22 settembre 2013 alle 13:09

    […] post di ieri, Precisione è stato visitatissimo! E Orlando mi chiede una cosa che è difficile far stare in un commento. E […]

  • Precisione iii | Ok, panico su 23 settembre 2013 alle 11:31

    […] scorso di persona al GuIT meeting di Napoli. E proprio Orlando ha commentato il post di Juhan Precisione su questo stesso blog, di qualche giorno fa su alcuni calcoli. Questo dimostra che gli appassionati […]

Rispondi

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

Logo di 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...

Questo sito utilizza Akismet per ridurre lo spam. Scopri come vengono elaborati i dati derivati dai commenti.

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