non capisco cosa tu voglia migliorare... l'algoritmo è la classica approssimazione di e^x in serie con MacLaurin, e non vedo alternative particolarmente vantaggiose...

si può fare qualcosa coi metodi di integrazione numerica, ma non mi pare molto coveniente... lo sviluppo in serie è sicuramente più veloce.

E anche come codice non mi pare così brutto... io lascerei com'è.

L'unica cosa che si potrebbe modificare è il controllo di precisione: invece di dare un numero MAX_N di iterazioni forse sarebbe preferibile controllare l'errore commesso (lo si fa col Resto di Lagrange). In questo caso il codice risulterebbe una cosa del tipo:

codice:
#include <stdio.h>
#define prec 0.001 //ad esempio...

double abs(double x) {
double a;
   if (x < 0) {
    a = -x;
   } else { a = x; }
   return(a);
}

long double exp(long double x){
   int i;
   long double e, er;
   i = 0;
   e = 0;
   er = 1;
   while (abs(e - er) > prec) {
   e = e + (pow(x, i)/fct(i));
   i++;
   er = pow(x, i)/fct(i);
   } 
   return(e);
}