• Sábado 18 de Mayo de 2024, 19:21

Autor Tema:  problemas con el fmod  (Leído 3680 veces)

pablo_ivan57

  • Nuevo Miembro
  • *
  • Mensajes: 19
    • Ver Perfil
problemas con el fmod
« en: Lunes 10 de Noviembre de 2008, 05:26 »
0
Hola a todos, necesito ayuda con esta funcion, quiero calcular esta expresion (b^e)mod n, mi problema es que en esta funcion uso los siguinetes valores: b=7,e=67 y n=101, el resultado deberia ser 8, pero por alguna razon el compilador me devuelve 67 y no tengo idea porque, revise que las variables que llegan a la funcion sean las correctas y si, el problema occurre al usar la funcion fmod(), si me pueden ayudar les agradeceria muchisimo.
Esta es la funcion:

long int encriptar(long int b){
     long int dato;
     dato=int(fmod(pow(b,e),n));
     return dato;
}

Gracias.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: problemas con el fmod
« Respuesta #1 en: Lunes 10 de Noviembre de 2008, 09:05 »
0
Pero en esta función utilizas variables que no están declaradas...

pablo_ivan57

  • Nuevo Miembro
  • *
  • Mensajes: 19
    • Ver Perfil
Re: problemas con el fmod
« Respuesta #2 en: Lunes 10 de Noviembre de 2008, 13:47 »
0
Muchas gracias por tu respuestas. Si tienes razon , me olvidaba de mencionar que las variables que no estan dentro de la funcion, las declare como variables globales, asi que por ese lado no hay problema, como dije si probe con el debbuger para ver cual era el error y todos los valores que lleganban a la funcion fmod eran los correctos, no se si ignoro algun limite de la funcion fmod o algo.
Gracias.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: problemas con el fmod
« Respuesta #3 en: Lunes 10 de Noviembre de 2008, 15:17 »
0
No deberías usar variables globales, sólo hacen más difícil entender y depurar el código, además de ser fuente de innumerables errores. Es considerado mala programación.

¿Hay alguna razón en particular para usar fmod() y pasar el resultado a int en vez de usar directamente el operador %?

pablo_ivan57

  • Nuevo Miembro
  • *
  • Mensajes: 19
    • Ver Perfil
Re: problemas con el fmod
« Respuesta #4 en: Lunes 10 de Noviembre de 2008, 22:05 »
0
Ok, gracias por tu respuesta acerca de lo de variables globales coincido contigo, sin embargo esta vez las cree para no alterar la funcion mucho ya que la tenia en varios lugares, solo lo hize para probar(talvez cometi un error) asi como cree esa variable dato para ver mas claramente el resultado de la expresion, pero mi pregunta va a otro lado, no uso el operador % porque requiere de tipos int para trabajar, y como dije los datos que usaba eran pow (6,67),lo cual es un numero que parece que necesita un tipo double para ser alojada no se si me equivoco. Por eso decidi usar fmod sin embargo me da este probema de que pow(6,67)mod 101=67 lo cual no es correcto deberia ser 8. Una cosa mas ya comprobe que los datos que llegan a la expresion sean los correctos, por lo cual creo que ignoro algo con los tipos de datos. Gracias por su ayuda.
Saludos.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: problemas con el fmod
« Respuesta #5 en: Martes 11 de Noviembre de 2008, 09:25 »
0
Pues mi calculadora científica dice que:

6^67 = 1,3681501919202227984531053980511e+52 MOD 101 = 65 (seguramente por perder precisión en la potencia).

eternity

  • Miembro activo
  • **
  • Mensajes: 78
  • Nacionalidad: ar
    • Ver Perfil
    • http://lameriendadejuan.blogspot.com/
Re: problemas con el fmod
« Respuesta #6 en: Martes 11 de Noviembre de 2008, 15:48 »
0
Cita de: "pablo_ivan57"
en esta funcion uso los siguinetes valores: b=7,e=67 y n=101, el resultado deberia ser 8

Cita de: "m0skit0"
Pues mi calculadora científica dice que:

6^67 = 1,3681501919202227984531053980511e+52 MOD 101 = 65 (seguramente por perder precisión en la potencia).

no hay nada malo con tu calculadora, solo que usaste 6^67 y no 7^67!

saludos!

 :beer:


m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: problemas con el fmod
« Respuesta #7 en: Martes 11 de Noviembre de 2008, 16:18 »
0
Cita de: "pablo_ivan57"
como dije los datos que usaba eran pow (6,67),lo cual es un numero que parece que necesita un tipo double para ser alojada no se si me equivoco. Por eso decidi usar fmod sin embargo me da este probema de que pow(6,67)mod 101=67 lo cual no es correcto deberia ser 8
Las ambigüedades matan...

pablo_ivan57

  • Nuevo Miembro
  • *
  • Mensajes: 19
    • Ver Perfil
Re: problemas con el fmod
« Respuesta #8 en: Viernes 14 de Noviembre de 2008, 00:27 »
0
Tienes razon,disculpen, confundi los numeros en mi segundo mensaje, lo que queria decir es pow(7,67)mod 101, pero el resultado de fmod usando datos de tipo double es 67, por ejemplo este programa:
Código: Text
  1. #include <iostream>
  2. #include <math.h>
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.     double resultado,base=7,exponente=67,mod=101;
  8.      resultado=fmod(pow(base,exponente),mod);
  9.     cout<<resultado<<endl;
  10.     cin.get();
  11. }
  12.  
muestra por consola 67, en este caso deberia ser 8 lo que muestre el resultado. Entonces no se que podria estar pasando con la funcion.Gracias.Saludos

punteroNULO

  • Miembro activo
  • **
  • Mensajes: 73
    • Ver Perfil
Re: problemas con el fmod
« Respuesta #9 en: Domingo 16 de Noviembre de 2008, 13:00 »
0
El problema es la presición. Cuando se realiza la operacion 7^67 y se guarda en un tipo double se pierden dígitos.

Una solución es dividir el problema y utiizar números más pequeños en las operaciones. Como esto:
Código: Text
  1.  
  2. #include <stdio.h>
  3.  
  4. int main()
  5. {
  6. int i, base, expo, mo, res=1;
  7. base=7;
  8. expo=67;
  9. mo=101;
  10. for(i=0; i< expo; i++)
  11. {
  12.        res = (res*base)%mo;
  13. }
  14. printf("%dn", res);
  15. return 0;
  16. }
  17.  
  18.  

que da el resultado esperado: 8.

El código se puede optimizar bastante, pero eso ya te lo dejo.

Un saludo.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: problemas con el fmod
« Respuesta #10 en: Domingo 16 de Noviembre de 2008, 21:55 »
0
Cita de: "punteroNULO"
se guarda en un tipo double se pierden dígitos.
En Visual C++ : double 8 bytes rango: 1.7E +/- 308 (15 digitos), que creo que es bastante más que pow(7,67). Bueno, si funciona, funciona, jejeje.

punteroNULO

  • Miembro activo
  • **
  • Mensajes: 73
    • Ver Perfil
Re: problemas con el fmod
« Respuesta #11 en: Domingo 16 de Noviembre de 2008, 23:40 »
0
Bueno. 7^67 es igual a 418377847259091645147530834859099334519176045887014771543, tiene 57 digitos (sino me equivoque al contar).
Mientras que el tipo double es capaz de almacenar 15-16 dígitos significativos.
Por lo tanto estamos perdiendo información importante en este caso, puesto que queremos obtener el resto de una división, donde son importantes los terminos menos significativos.

En otras operaciones si se puede utilizar el tipo double sin problemas.

Un saludo a todos.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: problemas con el fmod
« Respuesta #12 en: Lunes 17 de Noviembre de 2008, 09:23 »
0
1.7E +/- 308. Bueno ¿se supone que llega hasta 10^308 o estoy atontao como siempre, jejeje?

punteroNULO

  • Miembro activo
  • **
  • Mensajes: 73
    • Ver Perfil
Re: problemas con el fmod
« Respuesta #13 en: Lunes 17 de Noviembre de 2008, 17:56 »
0
Cita de: "m0skit0"
1.7E +/- 308. Bueno ¿se supone que llega hasta 10^308 o estoy atontao como siempre, jejeje?
Que admita ese rango de valores no quiere decir que almacene los 308 dígitos del número.

Para este caso el número almacenado en un tipo double sería: 4,1837784725909164 * 10^56
Siendo el valor 418377847259091645147530834859099334519176045887014771543. Como se ve se pierden los menos significativos. En la mayoría de las operaciones el error es insignificante y no hay problema. Pero en este caso al ser el resto de una división todo el número es importante al realizar el cálculo.

P.D.: hay que tener cuidaddo cuando se realizan operaciones en coma flotante porque pueden dar resultados inesperados.

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: problemas con el fmod
« Respuesta #14 en: Lunes 17 de Noviembre de 2008, 19:28 »
0
Cita de: "punteroNULO"
Que admita ese rango de valores no quiere decir que almacene los 308 dígitos del número
¿Entonces para qué dan ese rango si no almacena 308 dígitos? Un rango significa que incluye todos los números dentro de ese intervalo.  :wacko:

P.D: de hecho el desbordamiento fue el primer problema que consideré, pero la verdad es que lo descarté por el rango que se daba.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: problemas con el fmod
« Respuesta #15 en: Lunes 17 de Noviembre de 2008, 19:38 »
0

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.