Hola; te comento algunas cosas que no están bien.
Código:
float ni = 1; //es el factorial !n
Estás inicializando la variable de tipo float con un 1, que es entero. El compilador lo va a "castear" a float de todos modos, pero en general conviene ser explícito, para evitar errores. Entonces, conviene:
Código:
float ni = 1.0f; // la f indica que 1.0 es de tipo float, si no se pone sería un double.
Pero, por otro lado, si ni va a guardar el resultado de calcular un factoria, y un factorial es un número entero, no hay razón para que la variable sea de tipo float. Debería ser
n es otra de las variables que no deberían ser de tipo float.
Otra:
Código:
e += 1/ni; //aqui "e" vale 2
Aquí 1 es un int, que dividido por cualquier otro entero mayor que 1 va a dar 0 (división entera). En la primera ocurrencia no hay problema porque ni vale 1, pero en la segunda, dentro del segundo bucle while, deberías poner
para que se puedan ir incrementando en partes fraccionarias. Otra vez, 1.0f es una constante de tipo float.
Código:
while (e != 2.718055556){
Probablemente esta desigualdad va a resultar true eternamente. Por causa de la forma en que se representan los números float o double, nunca deberían compararse de esa manera. En este caso, creo que podría ser suficiente
Código:
while (e <= 2.718055556){
Hay una explicación completa en
http://www.parashift.com/c++-faq/flo...int-arith.html
Y por último, la serie que tienes es muy lentamente convergente, por lo que vas a necesitar unos cuantos miles de millones de ciclos para llegar a un valor aproximado de e como el que pretendes.