Programacion epsilon y cifra minima

Muy buenas!

Estamos con programación en Fortran 77, pero empezando(vamos lo minimo). El profesor nos ha mandado hacer un "sencillo" pograma que nos encuentre la cifra minima que sumada a 1 de diferente de 1. Me podeis echar una mano? es que no se ni siquiera plantearlo.
Tampoco me va la vida en ello, pero contra antes lo sepa bastante mejor.

Un saludo
Joder el 0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001

:p

Yo voy a aprender en C pero no tengo ni idea xDD

Mejor hubieras preguntado en pc o por ahí ;)
Al estar aprendiendo imagino que el profesor no querrá que diseñeis complejos algoritmos ni nada.

Así que es tan fácil como hacer un bucle que añada un número cada vez más pequeño (por ejemplo, diviendiendo 1 entre 10 a cada paso) sumarlo a uno y comprobar con un condicional si es distinto de uno, y así hasta que encuentres uno que no cumpla dicha condición.

(si lo haces dividiendo entre 10, al final de bucle puedes comprobar los 10 números que saltas entre la iteración n-1 y la n, para ajustar todavía más)

Y si quieres algo un poco más complejo de programar y más eficiente, busca por google "algoritmo búsqueda dicotómica" , pero si estais aprendiendo no creo que sea lo que el profesor quiere.
Gracias por las respuestas.

Bueno, la verdad es que hoy hemos empezado con lo basico basico......declarar variables y todo eso. Aun asi , he podido hacer algo medianamente comible.
Debes introducir un numero, ese lo compara con la cifra minima que puede representar. Si es mayor te escupe que esa no es. Si es igual te dice que es esa.

Sencillito sencillito, ahora deberia probar con que si es menor....jejej

Un saludo
El profe se ha lucido. La solución es 1 dividido entre 10 elevado al infinito. El problema es que no se me ocurre como hacer que un PC llegué a esa conclusión el solito.

Edito: ups, yo he planteado el problema en C++. A lo mejor con lo que os enseñan a vosotros se puede, pero sigo sin imaginarmelo.
Namco69 escribió:El profe se ha lucido. La solución es 1 dividido entre 10 elevado al infinito. El problema es que no se me ocurre como hacer que un PC llegué a esa conclusión el solito.

Edito: ups, yo he planteado el problema en C++. A lo mejor con lo que os enseñan a vosotros se puede, pero sigo sin imaginarmelo.


Bueno, creo que es diferente. Creo que el profesor quiere utilizar la idea de reales de precision normal y precision doble, con todo lo que ello conlleva.
si trabajas en precision normal solo te "reconoceria" como cifra minima(lo que llaman epsilon) el valor 1E10-7 osease 0.0000001 y precision doble seria algo como 1E-15. digo como cifra minima por que todo menor que ese numero lo trataria como un cero

Un saludo
Paikhuan escribió:Bueno, creo que es diferente. Creo que el profesor quiere utilizar la idea de reales de precision normal y precision doble, con todo lo que ello conlleva.
si trabajas en precision normal solo te "reconoceria" como cifra minima(lo que llaman epsilon) el valor 1E10-7 osease 0.0000001 y precision doble seria algo como 1E-15. digo como cifra minima por que todo menor que ese numero lo trataria como un cero

En realidad sí se pueden representar números más pequeños que 10^-7 y 10^-15 con float y double, al ser en coma flotante la recta real no está dividida en fracciones del mismo tamaño, lo que pasa es que se pierde precisión. Por ejemplo podrías representar 10^-14 con precisión normal y ser el resultado exacto y operar con él sin que te lo tome como 0, pero no 1+10^-14, porque se redondería a uno de los 2 números más cercanos representables con precisión normal.
Lo que dices de 10^-7 y 10^-15 serían las precisiones al expresar el número con notación científica. Con los ejemplos de antes:
- 10^-14 en notación científica: 1 * 10^-14 => se representa con exactitud.
- 1+10^-14 en notación científica: 1.00000000000001 * 10^0 => tiene la mantisa con más de 7 decimales, por lo que hay que redondear a 1.0000000 * 10^0 y se pierde precisión.
Hay que ajustar el epsilon al problema dependiendo de la magnitud de los números con los que operemos. En el caso de tu ejercicio, al coincidir 1 con su representación en notación científica pues debería coincidir la precisión con el epsilon.


Espero no haber dicho ninguna burrada, ahí queda lo poco que recuerdo de este tema.
Namco69 escribió:El profe se ha lucido. La solución es 1 dividido entre 10 elevado al infinito. El problema es que no se me ocurre como hacer que un PC llegué a esa conclusión el solito.

Edito: ups, yo he planteado el problema en C++. A lo mejor con lo que os enseñan a vosotros se puede, pero sigo sin imaginarmelo.

Un PC no maneja números infinitos, así que la solución no puede ser esa. Y aunque el lenguaje sea distinto, obviamente ninguno maneja infinitos, por tanto tiene solución tanto en C, C++, Fortran...

¿Cómo has planteado el algoritmo?
Súmale el número mas pequeño capaz de representar Fortran, si no me equivoco es un double ;)
Como te han dicho lo mas obvio de programar es un programa que sume 1+(1/10^n) o 1+10^-n (tanto monta, monta tanto), ir incrementando la 'n' hasta que el resultado sea igual a 1. Cuando eso pase el valor más pequeño que se le pueda sumar a 1 será 10^n-1 (porque recordemos que con 'n' ya no suma lo que debe, así que el valido es la iteración anterior)
El resultado de este programa acerca a Alonso más si cabe a ferrari, pero de manera infinitesimal XD
10 respuestas