Java - Código de euler

 
Vista:

Código de euler

Publicado por Daniel (1 intervención) el 16/09/2018 02:28:51
IMG_20180915_162321
Me podrían ayudar a resolver este código es que no se como realizar bien el diagrama de flujo ninel código
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
Imágen de perfil de Kabuto
Val: 3.428
Oro
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Código de euler

Publicado por Kabuto (1381 intervenciones) el 25/09/2018 14:14:44
Hola.
Quizás un poco tarde para responder, pero aún así voy a hacerlo para quien pueda ser útil. Además este es un ejercicio matemático interesante.
El ejercicio en sí no parece difícil, basta ver la imagen del enunciado para entender lo que se necesita.
Se ve una sucesión de numeros: 0, 1, 2, 3, 4, .... y a cada número de esta sucesión hay que hacerle el factorial.
Con dichos factoriales se calculan fracciones tipo 1/f! y se van sumando los resultados de estas fracciones.

Esto se repite hasta que la diferencia de restar los últimos dos sumandos de la serie, la diferencia sea inferior a 0.001.
Así que esta será la condición que pondrá fin a un bucle

Vamos a ver como conseguirlo:

Lo primero, y aunque no es estrictamente necesario, para que quede más claro lo que se está haciendo, podemos declarar una variable constante con la "diferencia limite" entre los dos sumandos:
1
static final double DIFERENCIA_LIMITE = 0.0001;

Luego, y esto si es imprescindible, puesto que nos piden trabajar con factoriales, vamos a necesitar un método al cuál le vayamos pasando los número de la sucesion: 0, 1 ,2 3, 4, 5,...... y nos devuelva su factorial.

Esto nos lo proporciona este sencillo método:
1
2
3
4
5
6
7
8
9
10
static long factorial(int n) {
 
		long factorial = 1;
 
		for (int i = 1; i <= n; i++) {
			factorial *= i;
		}
 
		return factorial;
	}

Hay que notar que en lugar de usar el típico valor int, he puesto que devuelva un valor de tipo long.
Esto es porque los factoriales de los números enseguida nos dan como resultado números extremedamente grandes para manejarlos con los 4 bytes de los valores int.
Con long, tenemos 8 bytes para almacenar numeros grandes. Y aún así, como veremos luego más tarde, tan solo es capaz de almacenar hasta el factorial de 65.

Bien, teniendo este método de apoyo que nos dará factoriales, comenzamos el metodo main() principal.

Necesitamos comparar dos "sumandos": el sumando actual con el sumando anterior a este.
Así que usaremos dos variables de tipo double. En una se calculará el sumandoActual que hay que sumar, y en la otra guardaremos copia del sumandoAnterior, el cual ya se ha sumado anteriormente pero aún lo necesitamos para comprobar si la diferencia entre ellos es inferior al limite impuesto.

Luego usaremos otra variable double donde se irán acumulando las sumas de los sumandos que nos irán dando el numero euler.
Y por último un simple int que irá incrementándose en cada ejecución y nos irá dando números (0,1,2,3,4,5....)para la secuencia de factoriales

Tras esto iniciamos un bucle do ...while() que se irá repitiendo hasta que la diferencia entre sumandos cumpla el límite.
En cada iteración del bucle lo que haremos será guardar copia del sumandoActual en sumandoAnterior.
Calculamos un nuevo sumando para sumandoActual.
Lo acumulamos en la variable para el numero euler.
Incrementamos el int que nos da la secuencia
Y pro último se comprueba si se cumple la condición que pondrá fin al bucle

Y ya está así de sencillo.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public static void main(String[] args) {
 
		double sumandoActual = 1d / factorial(0);//Inicializamos directamente con el primer sumando de la secuencia
		double sumandoAnterior = 0;
		double euler = sumandoActual;
		int n = 1;
		do {
			sumandoAnterior = sumandoActual;//Hacemos "copia" del ultimo sumando para luego poder calcular diferencia con el nuvo sumando
			sumandoActual = (1d / factorial(n));
			euler += sumandoActual;
			n++;
			//Info para comprobar en pantalla la evolucion de los calculos
			System.out.println("\nFactorial de " + n + ": " + factorial(n));
			System.out.println("Sumando Actual: " + sumandoActual);
			System.out.println("Diferencia actual: " + (sumandoActual - sumandoAnterior));
			System.out.println("Euler actual: " + euler);
		}while(sumandoActual - sumandoAnterior < DIFERENCIA_LIMITE);
 
		System.out.println("Numero Euler: " + euler);
	}

Fijémonos en el detalle de que para calcular los sumandos, al valor 1 es importante especificarle a Java que queremos que lo considere como un double añadiendole el caracter 'd'
- sumandoActual = (1d / factorial(n));

Ese 1, en realidad, sería un entero y si no ponemos nada Java lo considerará como tal. Pero entonces ocurre una cosa algo indeseable, si Java utiliza ese 1 como un entero, luego el resultado de la división nos viene "capado" respecto al número de decimales. Y en este ejercicio los decimales son importantísimos.

Así que tenemos que indicarle a Java que necesitamos que sea lo más exacto posible con los decimales, y por ello le indicamos que ese valor 1 lo interprete como un double, por eso le añadimos la letra 'd'.
Podéis hacer la prueba y quitarle la letra 'd'. Veréis como el ejericicio no funcionará.

También habría funcionado ponerlo así:
sumandoActual = (1.0 / factorial(n));


En cualquier caso, a pesar de que el código es correcto, el resultado de este ejercicio no es perfecto. Nos encontramos con el problema mencionado anteriormente, de que estamos trabajando con números increiblemente grandes y llega un momento en que Java pierde el control sobre ellos y es incapaz de seguir operando.

En el bucle he añadido unos mensajes para ver en pantalla los cálculos que se producen en cada repeticion del bucle.
En ellos se puede ver como el numero de Euler se está calculando correctamente, pero tras superar el factorial de 65, los números son demasiado grandes y Java ya no puede operar con ellos.

Esto es el resultado que obtenemos en pantalla:
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
Factorial de 2: 2
Sumando Actual: 1.0
Diferencia actual: 0.0
Euler actual: 2.0
 
Factorial de 3: 6
Sumando Actual: 0.5
Diferencia actual: -0.5
Euler actual: 2.5
 
Factorial de 4: 24
Sumando Actual: 0.16666666666666666
Diferencia actual: -0.33333333333333337
Euler actual: 2.6666666666666665
 
Factorial de 5: 120
Sumando Actual: 0.041666666666666664
Diferencia actual: -0.125
Euler actual: 2.708333333333333
 
Factorial de 6: 720
Sumando Actual: 0.008333333333333333
Diferencia actual: -0.03333333333333333
Euler actual: 2.7166666666666663
 
Factorial de 7: 5040
Sumando Actual: 0.001388888888888889
Diferencia actual: -0.006944444444444444
Euler actual: 2.7180555555555554
 
Factorial de 8: 40320
Sumando Actual: 1.984126984126984E-4
Diferencia actual: -0.0011904761904761906
Euler actual: 2.7182539682539684
 
Factorial de 9: 362880
Sumando Actual: 2.48015873015873E-5
Diferencia actual: -1.7361111111111112E-4
Euler actual: 2.71827876984127
 
Factorial de 10: 3628800
Sumando Actual: 2.7557319223985893E-6
Diferencia actual: -2.2045855379188714E-5
Euler actual: 2.7182815255731922
 
Factorial de 11: 39916800
Sumando Actual: 2.755731922398589E-7
Diferencia actual: -2.48015873015873E-6
Euler actual: 2.7182818011463845
 
Factorial de 12: 479001600
Sumando Actual: 2.505210838544172E-8
Diferencia actual: -2.505210838544172E-7
Euler actual: 2.718281826198493
 
Factorial de 13: 6227020800
Sumando Actual: 2.08767569878681E-9
Diferencia actual: -2.296443268665491E-8
Euler actual: 2.7182818282861687
 
Factorial de 14: 87178291200
Sumando Actual: 1.6059043836821613E-10
Diferencia actual: -1.9270852604185937E-9
Euler actual: 2.7182818284467594
 
Factorial de 15: 1307674368000
Sumando Actual: 1.1470745597729725E-11
Diferencia actual: -1.491196927704864E-10
Euler actual: 2.71828182845823
 
Factorial de 16: 20922789888000
Sumando Actual: 7.647163731819816E-13
Diferencia actual: -1.0706029224547743E-11
Euler actual: 2.718281828458995
 
Factorial de 17: 355687428096000
Sumando Actual: 4.779477332387385E-14
Diferencia actual: -7.169215998581078E-13
Euler actual: 2.718281828459043
 
Factorial de 18: 6402373705728000
Sumando Actual: 2.8114572543455206E-15
Diferencia actual: -4.498331606952833E-14
Euler actual: 2.7182818284590455
 
Factorial de 19: 121645100408832000
Sumando Actual: 1.5619206968586225E-16
Diferencia actual: -2.6552651846596585E-15
Euler actual: 2.7182818284590455
 
Factorial de 20: 2432902008176640000
Sumando Actual: 8.22063524662433E-18
Diferencia actual: -1.4797143443923793E-16
Euler actual: 2.7182818284590455
 
Factorial de 21: -4249290049419214848
Sumando Actual: 4.110317623312165E-19
Diferencia actual: -7.809603484293113E-18
Euler actual: 2.7182818284590455
 
Factorial de 22: -1250660718674968576
Sumando Actual: -2.353334294364486E-19
Diferencia actual: -6.463651917676651E-19
Euler actual: 2.7182818284590455
 
Factorial de 23: 8128291617894825984
Sumando Actual: -7.995773634431128E-19
Diferencia actual: -5.642439340066642E-19
Euler actual: 2.7182818284590455
 
Factorial de 24: -7835185981329244160
Sumando Actual: 1.2302708207447328E-19
Diferencia actual: 9.22604445517586E-19
Euler actual: 2.7182818284590455
 
Factorial de 25: 7034535277573963776
Sumando Actual: -1.2762938906401676E-19
Diferencia actual: -2.5065647113849004E-19
Euler actual: 2.7182818284590455
 
Factorial de 26: -1569523520172457984
Sumando Actual: 1.4215580141988783E-19
Diferencia actual: 2.697851904839046E-19
Euler actual: 2.7182818284590455
 
Factorial de 27: -5483646897237262336
Sumando Actual: -6.371360397900381E-19
Diferencia actual: -7.79291841209926E-19
Euler actual: 2.7182818284590455
 
Factorial de 28: -5968160532966932480
Sumando Actual: -1.8236039240670545E-19
Diferencia actual: 4.547756473833327E-19
Euler actual: 2.7182818284590455
 
Factorial de 29: -7055958792655077376
Sumando Actual: -1.6755581463940166E-19
Diferencia actual: 1.4804577767303786E-20
Euler actual: 2.7182818284590455
 
Factorial de 30: -8764578968847253504
Sumando Actual: -1.4172418368442757E-19
Diferencia actual: 2.5831630954974094E-20
Euler actual: 2.7182818284590455
 
Factorial de 31: 4999213071378415616
Sumando Actual: -1.140956118433517E-19
Diferencia actual: 2.762857184107586E-20
Euler actual: 2.7182818284590455
 
Factorial de 32: -6045878379276664832
Sumando Actual: 2.0003148209969643E-19
Diferencia actual: 3.1412709394304813E-19
Euler actual: 2.7182818284590455
 
Factorial de 33: 3400198294675128320
Sumando Actual: -1.654019378602917E-19
Diferencia actual: -3.6543341995998813E-19
Euler actual: 2.7182818284590455
 
Factorial de 34: 4926277576697053184
Sumando Actual: 2.9410049454058236E-19
Diferencia actual: 4.595024324008741E-19
Euler actual: 2.7182818284590455
 
Factorial de 35: 6399018521010896896
Sumando Actual: 2.0299302758138027E-19
Diferencia actual: -9.110746695920209E-20
Euler actual: 2.7182818284590455
 
Factorial de 36: 9003737871877668864
Sumando Actual: 1.5627396556464773E-19
Diferencia actual: -4.6719062016732534E-20
Euler actual: 2.7182818284590455
 
Factorial de 37: 1096907932701818880
Sumando Actual: 1.1106498370231394E-19
Diferencia actual: -4.520898186233379E-20
Euler actual: 2.7182818284590455
 
Factorial de 38: 4789013295250014208
Sumando Actual: 9.116535400896201E-19
Diferencia actual: 8.005885563873062E-19
Euler actual: 2.7182818284590455
 
Factorial de 39: 2304077777655037952
Sumando Actual: 2.0881128081056919E-19
Diferencia actual: -7.028422592790509E-19
Euler actual: 2.7182818284590455
 
Factorial de 40: -70609262346240000
Sumando Actual: 4.340131265090123E-19
Diferencia actual: 2.252018456984432E-19
Euler actual: 2.7182818284590455
 
Factorial de 41: -2894979756195840000
Sumando Actual: -1.416244791081932E-17
Diferencia actual: -1.459646103732833E-17
Euler actual: 2.7182818284590455
 
Factorial de 42: 7538058755741581312
Sumando Actual: -3.4542555880047125E-19
Diferencia actual: 1.3817022352018848E-17
Euler actual: 2.7182818284590455
 
Factorial de 43: -7904866829883932672
Sumando Actual: 1.326601493041323E-19
Diferencia actual: 4.780857081046035E-19
Euler actual: 2.7182818284590455
 
Factorial de 44: 2673996885588443136
Sumando Actual: -1.2650434492072058E-19
Diferencia actual: -2.5916449422485286E-19
Euler actual: 2.7182818284590455
 
Factorial de 45: -8797348664486920192
Sumando Actual: 3.7397201372578964E-19
Diferencia actual: 5.004763586465103E-19
Euler actual: 2.7182818284590455
 
Factorial de 46: 1150331055211806720
Sumando Actual: -1.1367061124186126E-19
Diferencia actual: -4.876426249676509E-19
Euler actual: 2.7182818284590455
 
Factorial de 47: -1274672626173739008
Sumando Actual: 8.693149641308025E-19
Diferencia actual: 9.829855753726637E-19
Euler actual: 2.7182818284590455
 
Factorial de 48: -5844053835210817536
Sumando Actual: -7.84515160572452E-19
Diferencia actual: -1.6538301247032544E-18
Euler actual: 2.7182818284590455
 
Factorial de 49: 8789267254022766592
Sumando Actual: -1.7111409788440564E-19
Diferencia actual: 6.134010626880464E-19
Euler actual: 2.7182818284590455
 
Factorial de 50: -3258495067890909184
Sumando Actual: 1.1377512722033902E-19
Diferencia actual: 2.8488922510474465E-19
Euler actual: 2.7182818284590455
 
Factorial de 51: -162551799050403840
Sumando Actual: -3.0689013767550647E-19
Diferencia actual: -4.2066526489584546E-19
Euler actual: 2.7182818284590455
 
Factorial de 52: -8452693550620999680
Sumando Actual: -6.1518851580961055E-18
Diferencia actual: -5.844995020420599E-18
Euler actual: 2.7182818284590455
 
Factorial de 53: -5270900413883744256
Sumando Actual: -1.183054838095405E-19
Diferencia actual: 6.033579674286565E-18
Euler actual: 2.7182818284590455
 
Factorial de 54: -7927461244078915584
Sumando Actual: -1.897209056285646E-19
Diferencia actual: -7.141542181902412E-20
Euler actual: 2.7182818284590455
 
Factorial de 55: 6711489344688881664
Sumando Actual: -1.2614378919189395E-19
Diferencia actual: 6.357711643667066E-20
Euler actual: 2.7182818284590455
 
Factorial de 56: 6908521828386340864
Sumando Actual: 1.4899822507970561E-19
Diferencia actual: 2.7514201427159954E-19
Euler actual: 2.7182818284590455
 
Factorial de 57: 6404118670120845312
Sumando Actual: 1.4474876461866447E-19
Diferencia actual: -4.249460461041141E-21
Euler actual: 2.7182818284590455
 
Factorial de 58: 2504001392817995776
Sumando Actual: 1.561495111990375E-19
Diferencia actual: 1.1400746580373018E-20
Euler actual: 2.7182818284590455
 
Factorial de 59: 162129586585337856
Sumando Actual: 3.9936080022487647E-19
Diferencia actual: 2.43211289025839E-19
Euler actual: 2.7182818284590455
 
Factorial de 60: -8718968878589280256
Sumando Actual: 6.1679056923619804E-18
Diferencia actual: 5.768544892137104E-18
Euler actual: 2.7182818284590455
 
Factorial de 61: 3098476543630901248
Sumando Actual: -1.1469246122160708E-19
Diferencia actual: -6.282598153583587E-18
Euler actual: 2.7182818284590455
 
Factorial de 62: 7638104968020361216
Sumando Actual: 3.2273925134452225E-19
Diferencia actual: 4.374317125661293E-19
Euler actual: 2.7182818284590455
 
Factorial de 63: 1585267068834414592
Sumando Actual: 1.3092252648881562E-19
Diferencia actual: -1.9181672485570662E-19
Euler actual: 2.7182818284590455
 
Factorial de 64: -9223372036854775808
Sumando Actual: 6.30808536718839E-19
Diferencia actual: 4.998860102300234E-19
Euler actual: 2.7182818284590455
 
Factorial de 65: -9223372036854775808
Sumando Actual: -1.0842021724855044E-19
Diferencia actual: -7.392287539673894E-19
Euler actual: 2.7182818284590455
 
Factorial de 66: 0
Sumando Actual: -1.0842021724855044E-19
Diferencia actual: 0.0
Euler actual: 2.7182818284590455
 
Factorial de 67: 0
Sumando Actual: Infinity
Diferencia actual: Infinity
Euler actual: Infinity
Numero Euler: Infinity
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