Stomachion

mercoledì 4 marzo 2015

Schema per affrontare il calcolo di un esponenziale

Erano un po' di giorni che ci pensavo. E' che, semplicemente, mi sembrava incredibile che la maggior parte delle funzioni per il calcolo dell'esponenziale dei principali linguaggi di programmazione (inclusi gli algoritmi di Google e Wolfram Alpha) fallavano nel calcolo di $-2^{7/5}$, mentre una calcolatrice scientifica installata su uno smartphone propone il risultato giusto, nello specifico -2.639015822. Sicuramente gli algoritmi fallaci di cui sopra non hanno al loro interno una non sono in grado di gestire tutte le varie possibilità che un calcolo del genere propone agli studenti dei corsi di matematica sin dalle scuole superiori. E non è così stupefacente che un programmatore non abbia pensato a tutte le possibilità, per il semplice fatto che un buon programmatore non è necessariamente un buon matematico (e generalmente non lo è: non solo, la matematica non è nemmeno essenziale per assumere qualcuno come programmatore!). Ad ogni modo quali potrebbero essere tutte le possibilità che si dovrebbero prendere in considerazione nell'affrontare un problema del genere? Ho provato a fare uno schema:
Come vedete nello schema mi sono concentrato nell'operazione $a^{b/c}$ (con almeno $b$, $c$ interi), questo perché se vogliamo programmare un generico $a^b$, dobbiamo in qualche modo saper trattare con $b$ decimali, quindi saper calcolare $a^{b/c}$ è essenziale tanto quanto saper razionalizzare un numero decimale (e quindi anche questo algoritmo andrebbe richiamato all'interno del nostro programma).
Ovviamente, se ho scordato qualche possibilità, o se avete da proporre strade per la razionalizzazione o altre strade ancora, ci sono i commenti per discuterne.

2 commenti:

  1. In realtà ci sono linguaggi che vanno bene, p.es. in Common Lisp, interattivo:

    * (defvar c (expt -2 (/ 7 5)))
    C
    * c
    #C(-0.81550074 -2.5098531)
    * (defvar r (realpart c))
    R
    * (defvar i (imagpart c))
    I
    * (defvar n (expt (+ (* r r) (* i i)) (/ 1 2)))
    N
    * n
    2.6390157

    Il numero restituito, c, è complesso, ne calcolo la norma (o modulo) n. Il problema del segno è lasciato come esercizio.
    Ma con Linux (e forse anche con Windows) c'è un modo molto più semplice:

    calc -d
    ; c = (-2 ** (7 / 5))
    ; c
    -2.63901582154578851875

    calc lo trovi qui: www.isthe.com/chongo/tech/comp/calc/

    RispondiElimina
    Risposte
    1. Grazie mille dell'integrazione, carissimo!
      E ricordati del Carnevale!

      Elimina