e ancora: bc, Python e newLISP

Continuo le prove iniziate in e Nepero e Eulero e il Fortran  anche se rischio commenti di Hon-ki-ton (no, dai, benvenuto! e benvenuti i commenti).

Allora il Fortran con la fama di number cruncher che si ritrova non mi sembra che si sia comportato benissimo. E se provassi con qualche altro linguaggio?

OK, c’è bc con la precisione che vuoi e 40 anni di servizio, una sintassi simile al C, anzi migliore, come il C dovrebbe essere, proviamo

scale = 15
m = 1000
eps = 1 / m
for (c = 0; c < 3; c++) { 	eps /= m } print "eps = ", eps, "\n" eprec =0. n = 1. delta = 10. i = 0 cm = 100 * m while(delta > eps) {
	e = (1 + 1 / n) ^ n
	print n, " ", delta, " ", e, "\n"
	n += cm
	i += 1
	if (e > eprec) {
		delta = e - eprec
	} else {
		delta = eprec - e
	}
	eprec = e
}
print "valore accettabile è stato raggiunto con ", i, " iterazioni\n"
print "con delta = ", delta, "\n"

quit

Una piccola precisazione: non mi va di correggere lo script; al momento di scriverlo non ricordavo la sintassi per i numeri esponenziali e il collegamento a internet era giù. Poco male, quattro righe quando ne bastava una.

L’esecuzione non è andata come previsto: l’ho interrotto dopo 12 ore perché il ‘puter (2 CPU a 2.4 GHz) aveva il fiatone e eravamo ben lontani dalla meta. Comunque ecco


Sconsolante! Ma aspetta: io sono affezionato a Python, chissà, proviamo dai

#!/usr/bin/env python
# -*- coding: utf-8 -*-

eps = 1e-12
print "eps =", eps

eprec = 0
n = 1.
delta = 10.
i = 0
cm = 100000
while (delta > eps) and (i < 1000):
	e = (1 + 1/n) ** n
	print i, n, delta, e
	n += cm
	i += 1
	delta = abs(e - eprec)
	eprec = e

print "valore accettabile è stato raggiunto con ", i, " iterazioni"
print "con delta = ", delta

Non ce la fa e allora metto un limite alle iterazioni, diciamo 1000, ecco, velocissimo


Dai, quasi buono, e soprattutto usabile al posto di bc. Ma un attimo ancora: chissà newLISP il linguaggio di scripting migliore in assoluto, quello che davvero preferisco e non mi ha mai deluso, tranne il modulo per la gestione dell’ambiente grafico ma quello è scritto in Java. Vediamo

(set-locale "C") ; l'abitudine
(set 'eps 1.e-12)

(set 'eprec 0.
	 'n 1.
	 'delta 10.
	 'i 0
	 'cm 100000)

(while (and (> delta eps) (< i 4000))
	(begin
		(set 'e (pow (add 1 (div 1 n)) n))
		(println i " " n " " delta " " e)
		(set 'n (add n cm)
			 'i (+ i 1)
			 'delta (abs (sub e eprec))
			 'eprec e
		)
	)
)

(println "valore accettabile è stato raggiunto con " i " iterazioni")
(println "con delta = " delta)

(exit)

Ho messo il limite a 4000 iterazioni, il risultato è simile a quello di Python. Anche lui velocissimo. Notare che dopo un po’ i numeri oscillano attorno al valore esatto; probabilmente erano sufficienti meno iterazioni.


Certo che una cosa così non me la sarei mai aspettata. Ma voglio dare un’ultima chance a bc

scale = 15
n = 5 * 10^5
ec = (1 + 1 / n) ^ n
print ec, "\n"
print e(1) - ec, "\n"
quit

Ho fatto un po’ di prove, aumentando via-via in valore di n, ecco il risultato dell’ultima, per n pari a mezzo milione; l’esecuzione ha richiesto qualche minuto.


Quindi?
Ho imparato una cosa: non usare la definizione per il calcolo di e. Ci sarà un motivo per cui esiste una ricca letteratura, per esempio ecco Wiki 😀


Non so se è il caso di preoccuparmi: cercando per qualche immagine Google propone le mie a partire da p.9 😉

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