Algoritmo tosto!

Programmazione, algoritmica, teoria dell'informazione, ...
Rispondi
Jean-Paul
Messaggi: 36
Iscritto il: 16 lug 2007, 12:16

Algoritmo tosto!

Messaggio da Jean-Paul »

Come posso scrivere in linguaggio di progetto l’algoritmo per calcolare il valore di e^x usando la formula:

e^x = 1 + x/1! + x^2/2! + x^/3! + …

Grazie :?
Tibor Gallai
Messaggi: 1776
Iscritto il: 17 nov 2007, 19:12

Messaggio da Tibor Gallai »

Manca un 3.
Jean-Paul
Messaggi: 36
Iscritto il: 16 lug 2007, 12:16

Messaggio da Jean-Paul »

Dove mancherebbe il 3?

Potete darmi qualche dritta per la soluzione!

Grazie
Tibor Gallai
Messaggi: 1776
Iscritto il: 17 nov 2007, 19:12

Messaggio da Tibor Gallai »

Jean-Paul ha scritto:Dove mancherebbe il 3?
Nella formula che hai scritto nel 1° messaggio.
antosecret
Messaggi: 214
Iscritto il: 01 gen 1970, 01:00
Località: Catania

Messaggio da antosecret »

Se ho capito bene (spero) ti serve una funzione che calcoli:

ris = 1 + x^1/1! + x^2/2! +.... + x^k/k!

ho messo k come finale perchè se no andresti avanti all'infinito...... k definisce il grado di precisione

Allora potresti fare così: definite le funzioni

int potenza(int base, int esponente)
int fattoriale(int numero)

la somma diventa

risultato = 1
for(contatore =0;contatore <k; contatore++)
risultato = risultato + potenza(x,contatore+1)/fattoriale(contatore+1);
Jean-Paul
Messaggi: 36
Iscritto il: 16 lug 2007, 12:16

Messaggio da Jean-Paul »

Proprio così!
Grazie e buona domenica. :)
Avatar utente
pa
Messaggi: 81
Iscritto il: 14 feb 2008, 16:14
Località: Genova

Messaggio da pa »

attenzione ai fattoraili vanno in overflow che e' una meraviglia (e' il motivo per cui e' fortemente sconsigliato calcolare i binomiali con la farmula con i fattoriali).
Con gli interi ti devi fermare a 12! mentre con i long long a circa 23!...
paolo
gmascellani
Messaggi: 5
Iscritto il: 01 gen 1970, 01:00
Località: Pisa
Contatta:

Messaggio da gmascellani »

In ogni caso hai un algoritmo quadratico mentre lo potresti fare lineare. Ok, è comunque pseudo-polinomiale, ma non è un buon motivo per tirarsi la zappa sui piedi!

Codice: Seleziona tutto

double ex(double x, int k) {
  double res = 1.0, fatt = 1.0, pow = 1.0;
  int i;
  for (i = 1; i <= prec; i++) {
    fatt *= i;
    pow *= x;
    res += pos / fratt;
  }
  return res;
}
Ovviamente non ho testato il codice.

Usando i double (tanto il risultato mica te lo trovi intero!) hai anche meno problemi di overflow, ma ci metto la mano sul fuoco che questo algoritmo è numericamente instabile.
fph
Site Admin
Messaggi: 3956
Iscritto il: 01 gen 1970, 01:00
Località: in giro
Contatta:

Messaggio da fph »

gmascellani ha scritto:ci metto la mano sul fuoco che questo algoritmo è numericamente instabile.
Confermo che lo è, per x negativi.
--federico
[tex]\frac1{\sqrt2}\bigl(\left|\text{loves me}\right\rangle+\left|\text{loves me not}\right\rangle\bigr)[/tex]
Rispondi