C/Visual C - Ayuda ejercicio en C

 
Vista:
sin imagen de perfil

Ayuda ejercicio en C

Publicado por Victor (17 intervenciones) el 19/08/2016 13:16:17
Hola buenas, tengo un problema con mi codigo. El programa tiene que calcular el seno de un numero como una serie de terminos. Mi problema es que cuando el termino de la serie, n , es 15 el valor de la variable serie toma un numero erroneo, los terminos anteriores los suma y salen todos bien, pero cuando n = 15 el programa me falla y no se por qué la verdad.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//Ejercicio 24
// Calcular el seno de un numero
 
 
#include <stdio.h>
#include <math.h>
 
void seno(int x);
 
int main(){
 
 
	int x;
 
	printf("Introduce el valor para calcular el seno: ");
	scanf("%i",&x);
 
	seno(x);
 
 
 
	system("pause");
	return 0;
}
 
void seno(int x){
 
	int i, n, j, aux;
	double serie;
 
	serie = 0.0;
	n = 3;
	aux = 1;
 
	for(i = 1; i < 20; i+= 2){ // factoriales
		aux = 1;
 
		for(j = 1; j <= n; j++){
			aux *= j;
		}
		if(i == 1){
			serie = x - (pow(x,n) / aux);
			n += 2;
		}
		else {
			serie =  serie + (pow(x,n) / aux); // aux = n!
			serie = (-1) * (serie); // falla cuando n = 15 no se por que
			n += 2;
		}
 
	}
 
 
	printf("El seno de %i es: %f \n",x,serie);
 
 
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Ayuda ejercicio en C

Publicado por Tom (619 intervenciones) el 19/08/2016 14:21:49
Casi con toda seguridad el factorial de n desborda aux.

Supongo que debes calcular cual es el máximo valor de n que puedes usar (depende del rango del tipo int - deberías usar un long-) y así calcular el número de iteraciones que puedes alcanzar.

http://stackoverflow.com/questions/19230573/cannot-calculate-factorials-bigger-than-20-how-to-do-so

Ah! también estaría bien que redujeras x a su valor más razonable en radianes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Ayuda ejercicio en C

Publicado por Victor (17 intervenciones) el 19/08/2016 17:06:15
hostias tio muchas gracias, me di cuenta de que podía desbordarse pero puse long y no era suficiente, sin embargo, me meti al enlace que me pusiste y no sabia que se podia poner dos veces long, o sea, como es posible que puedas poner dos veces long? le duplica el maximo o como. GRACIASS UN SALUDO
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda ejercicio en C

Publicado por Tom (619 intervenciones) el 19/08/2016 18:33:47
No te fíes mucho del tipo long long int ... igual estoy equivocado, pero creo recordar que esto te daba 64 bits si usabas un S.O de 32 bits en una CPU de 64 ...

En un S.O. de 64 bits, el tipo long tambien será de 64 bits ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda ejercicio en C

Publicado por Capitan Kirk (97 intervenciones) el 29/08/2016 21:33:57
En efecto, hay un desbordamiento de enteros al calcular el factorial. Con un entero de 32 bits (4 bytes), llegas hasta 12!, con 13! ya tienes desbordamiento (tanto para signed como para unsigned). Con un entero de 64 bits (8 bytes) llegas a 20!. Si necesitas ir más allá, puedes utilizar tipos en coma flotante (en simple precisión llegarías a 34!, con double a 170!).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar