Sul calcolo di base elevato esponente

1425797_10201940668950614_1418135656_nIeri sulla pagina Figli di Archimede, legittimi e… in adozione (su Facebook, non riesco a linkarla) Cristiano Armellini si chiede:

C’è un modo per definire una potenza con base negativa ed esponete razionale ? esempio (-2)^(7/5) … se provate a eseguire il calcolo con diversi software o ottenete un errore o un numero complesso, probabilmente il computer lo vede come e^(7/5 ln(-2)) che è complesso perché c’è il log di un numero negativo….ma questo passaggio non si potrebbe applicare per gli esponenti interi es (-2)^3 = -8 che non è complesso. Tuttavia (-2)^(1/3) è ben definito come la radice cubica di -2.

Verifico, intanto la versione C (tp.c):

#include <stdio.h>
#include <math.h>

int main () {
    double b = 2.0,
           e = 7.0 / 3.0;
    printf("%lf ^ %lf = %lf\n", b, e, pow(b, e));
    b *= -1;
    printf("%lf ^ %lf = %lf\n", b, e, pow(b, e));
    return(0);
}

COK con la base positiva, nan se negativa.

Vediamo Python, io sono un convinto Python-evangelista:

py

Stesso comportamento del C, anche se il messaggio d’errore è chiaro. Ovviamente questo è reso possibile nella modalità interattiva. Ah! sì, sono anche REPL-evangelista 😉

Quando devo fare calcoli al volo io sono affezionato a calc:

calc

Ottimo, invece dell’errore ottengo un risultato complesso. Da esaminare più approfonditamente 😉

Anticamente, prima di calc c’era bc:

bc

Se non ho sbagliato qualcosa no, non ci siamo. Ma essendo scale il numero di cifre decimali credo che il messaggio sia da intendere come “esponente non intero”. Uno sguardo al manuale chiarisce:

expr ^ expr
The result of the expression is the value of the first raised to
the second.  The second expression must be an integer.  (If  the
second  expression is not an integer, a warning is generated and
the expression is truncated to get an integer value.)  The scale
of  the  result  is  scale  if the exponent is negative.  If the
exponent is positive the scale of the result is the  minimum  of
the  scale  of the first expression times the value of the expo‐
nent and the maximum of scale and the scale of the first expres‐
sion.    (e.g.   scale(a^b)   =   min(scale(a)*b,   max(  scale,
scale(a))).)  It should be noted that expr^0 will always  return
the value of 1.

Ultimamente sono alle prese con il Lisp, Common Lisp (cit?):

cl

Stessi risultati di calc, bravo SBCL 😀

Ma c’è un’altra versione molto sexy di Lisp ottima per script veloci, newLISP:

nl

Rivela che sotto c’è il C (o C++). Notare che i numeri per noi italiani hanno la virgola e newLISP lo sa (è peraltro possibile normalizzare, anzi se si usano certi moduli è indispensabile).
Esiste (prima o poi ne parlerò) un altro sapore di Lisp piccolo e performante: Picolisp. Ma tratta nativamente solo gli interi (sì, devo proprio parlarne, prima o poi).

Un’ultima osservazione: quando ottenendo un numero complesso (calc e CL) c’è un ulteriore risultato calcolabile, la norma (o modulo (o valore assoluto)):

norma

Ecco, come previsto 😀

Infine, confessione: confesso di non aver chiara la questione del segno della base per calcoli con il ‘puter. Roba da matematti 😀

Annunci
Post a comment or leave a trackback: Trackback URL.

Commenti

Trackbacks

  • […] che dovevo riprendere un argomento discusso su Facebook e del quale ho anche fatto un post: Sul calcolo di base elevato esponente. Colpa anche di GLF, Gianluigi Filippelli, che l’altro giorno ha messo su Schema per […]

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 )

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 )

Google+ photo

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

Connessione a %s...

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