elrincondelc.com
Inicio :: Foros
Usuario: Clave: Regístrate
Salir


Como hacer 2 elevado a 64???
Ir a página 1, 2  Siguiente
 
Publicar Nuevo Tema   Responder al Tema    Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
Autor Mensaje
Pato_SZ



Registrado: 26 Oct 2004
Mensajes: 9

MensajePublicado: 27/10/2004 4:06 pm Responder citando
Título: Como hacer 2 elevado a 64???

Hola. quiero trabajar con una variable que contenga el numero 2 elevado a 64 (no sé como se hace el "elevado), pero no encuentro un tipo de dato que pueda trabajar con un numero tan alto, pensé en el long double pero al momento de imprimir me muestra un cero.
esto por ejemplo:
#include <stdio.h>
#include <math.h>

int main()
{
long double a;
a = pow (2,64);
printf ("%f", a);
return 0;
}

tengo la duda con el %f tambien (si esta bien usado)
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
quique



Registrado: 30 Mar 2004
Mensajes: 720
Ubicación: Por ahí

MensajePublicado: 28/10/2004 12:01 am Responder citando
Título:

Código:
#include <stdio.h>
#include <stdlib.h>

typedef struct MYLONG
{
   unsigned long MSB;
   unsigned long LSB;
} MYLONG, *PMYLONG;

void PotenciaDeDos (PMYLONG pmyLong, int iNumber);

int main()
{
   MYLONG a;
   int iInput = 0;

   /* Nota:
   2 a la 0 es 1 = 0001
   2 a la 1 es 2 = 0010
   2 a la 2 es 4 = 0100
   2 a la 3 es 8 = 1000

   es decir, para hacer 2 a la 64, tienes que hacer
   a = 1
   y desplazar el 0 a la izquierda 63 veces

   Ahora bien, la operación "<<" no está soportada para long double en los
   compiladores que yo uso (Ms VC++ y Dev-C++) así que te toca hacerte tu propia
   variable de 64 bits y usarla.
   */

   /* Bucle principal */
   while (iInput != 2)
   {
      system ("cls");
      printf ("1.- Calcular potencia de 2\n2.- Salir\nOpcion: ");
      fflush (stdin);
      scanf ("%d", &iInput);

      if (iInput == 1)
      {
         printf ("Hacer 2 a la ");
         fflush (stdin);
         scanf ("%d", &iInput);
         if (iInput<65)
         {
            /* Inicializar el valor 2 */
            a.MSB = 0;
            a.LSB = 1;

            PotenciaDeDos (&a, iInput);

            /* Para representar los valores, en un numbero de 32 bits, se necesitan
            8 posiciones hexadecimales. Uso el hexadecimal porque da una idea mejor
            si el resultado es válido o no*/
            printf ("0x%08X%08X\n", a.MSB, a.LSB);

            printf ("introduce algun valor para volver....");
            fflush (stdin);
            scanf ("%d", &iInput);
         }
      }
   }

   return 0;
}

void PotenciaDeDos (PMYLONG pmyLong, int iNumber)
{
    int iLSB = 0;
    int iMSB = 0;

    if (iNumber>31)
    {
       if (!pmyLong->MSB)
         pmyLong->MSB = 1;
       iMSB = iNumber - 32;
       pmyLong->LSB = 0;
    }
    else
       iLSB = iNumber;

    pmyLong->MSB = (pmyLong->MSB) << iMSB;
    pmyLong->LSB = (pmyLong->LSB) << iLSB;

}


El representar el resultado en decimal, tendria mas problemas pero se puede hacer, convirtiendo el valor hexadecimal en una cadena de string

Salu2
Volver arriba
Ver perfil del usuario Enviar mensaje privado
lute



Registrado: 19 Jul 2004
Mensajes: 8

MensajePublicado: 28/10/2004 9:27 am Responder citando
Título:

Mira pato es muxo mas sencillo q todo eso, la funcion pow devuelve una variable de tipo float no el q tu tienes y el return 0 sobra.
Para mostrar un float efectivamente es %f, si de todos modos no funciona escribeme y te dire una manera infinitamente mas facil y mas corta que la de quique aunque creo q solo te funcionara para potencias positivas, aunke para esta forma habria q utizar recursividad aunque tbn se podri utilizar un simple bucle.
Pruevalo y me dices q tal, suerte.
_________________
Las máquinas deben funcionar y las personas, pensar
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
Pato_SZ



Registrado: 26 Oct 2004
Mensajes: 9

MensajePublicado: 28/10/2004 3:19 pm Responder citando
Título:

Agradesco la respuesta de ambos.

Lute definí la variable a como long long float pero el resultado me dió:
1844674407370955161600.00000 y esos dos ceros antes del punto estan de más (segun la hp 49g+).

No sé si será importante pero ese programa en el Dev-c++ 5 (signed or unsigned invalid for `a') me da error en la definicion de variables pero el mismo programa puesto en el Turbo c++ 3.0 se compilaba sin errores pero al ejecutarlo me daba el resultado que ya escribí
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
quique



Registrado: 30 Mar 2004
Mensajes: 720
Ubicación: Por ahí

MensajePublicado: 28/10/2004 11:14 pm Responder citando
Título:

La funcion pow () recibe un float como entrada. El tamaño de los floats depende del compilador, pero normalmente son 32 bits. Desgraciadamente para Pato_sz, estamos hablado de 2 a la 64, que son 64 bits, con lo que habría que utilizar otros métodos aparte de la función pow

Ya te digo, creo que la mejor opción es utilizar el operador "<<" pero creo que solo es válido para valores enteros (long - int), por lo que me enbarqué en una solución bastante complicada, lo se.

Alguna idea más?

Salu2
Volver arriba
Ver perfil del usuario Enviar mensaje privado
Pato_SZ



Registrado: 26 Oct 2004
Mensajes: 9

MensajePublicado: 29/10/2004 9:30 am Responder citando
Título:

La solución de quique no me sirve porque no la entiendo (estoy recien empezando a programar). Ahun asi gracias por responder
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
lute



Registrado: 19 Jul 2004
Mensajes: 8

MensajePublicado: 29/10/2004 12:39 pm Responder citando
Título:

con lo sencillo q es y la de vueltas q le estamos dando a la perdiz. Vamos a ver partiendo de la base de q 2 elevado a 64 es multiplicar dos por el mismo 64 veces, lo mas facil es hacer un simple bucle q se itere 64 veces y q lo q haga sea multiplicar 2 por si mismo. ejemplo:

long double res;
res=2;
for (con=0;con<64;con++){
res=res+2;
}
printf(%d,res);

Y ya lo pa rematarlo se meteria en una funcion por ejemplo mypow(), pero eso ya te lo curras tu.
Para esta potencia a concreto se podria usar una funcion recursiva, pero si estas empezando no kiero liarte con eso.
Pos nada pruebalo y ya me contaras. Suerte.
_________________
Las máquinas deben funcionar y las personas, pensar
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
Pato_SZ



Registrado: 26 Oct 2004
Mensajes: 9

MensajePublicado: 29/10/2004 1:25 pm Responder citando
Título:

Lute he hecho eso ya muchas veces pero siempre me da el mismo resultado.
¿No hay un buen compilador para windows?

PD: res= res*2;
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
alp



Registrado: 12 Abr 2004
Mensajes: 413

MensajePublicado: 29/10/2004 2:15 pm Responder citando
Título:

Hola

He probado el bucle y la función pow().

Estos son mis resultados:


1) 18446744073709552000.000000
2) 18446744073709551600.000000
3) 18446744073709551620.000000
4) 1.844674407 e 19

Los he hecho con....

1) Dev-Cpp
2) TurboC 2.0
3) Borland C++ 5.02
4) Calculadora casio fx-4500P

Los he hecho con una variable de tipo double, ya que en Turbo C y Borland C, las variables float tienen un tamaño de 4 bytes.

Un saludo.
Volver arriba
Ver perfil del usuario Enviar mensaje privado Yahoo Messenger
Pato_SZ



Registrado: 26 Oct 2004
Mensajes: 9

MensajePublicado: 29/10/2004 4:54 pm Responder citando
Título:

Cita:
1) 18446744073709552000.000000
2) 18446744073709551600.000000
3) 18446744073709551620.000000
4) 1.844674407 e 19

Los he hecho con....

1) Dev-Cpp
2) TurboC 2.0
3) Borland C++ 5.02
4) Calculadora casio fx-4500P


5) 18446744073709551616 (hp 49g+)

¿Las maquinas se equivocan? ¿que queda pa los humanos?
hay que hacer a mano el calculo. yiaaaaa

Gracias
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
quique



Registrado: 30 Mar 2004
Mensajes: 720
Ubicación: Por ahí

MensajePublicado: 04/11/2004 12:33 am Responder citando
Título:

yo sigo pensando que el problema está en el tamaño

Very Happy

Es decir, un float son 32 bits, y 2 a la 64 son 64 bits. Por eso descarte el uso de la funcion "pow"

segun la calculadora de windows, el resultado es
18446744073709551616

Este valor, en hexadecimal es:
0x100000000

El problema esta en como mostrarlo en pantalla, porque el cálculo es "sencillo".

Salu2
Volver arriba
Ver perfil del usuario Enviar mensaje privado
Demidam



Registrado: 07 Ago 2004
Mensajes: 59

MensajePublicado: 04/11/2004 7:06 am Responder citando
Título:

No es por nada, pero si dices q el problema esta en el tamaño, double tiene 64 bits no?
Yo lo he echo con un double y con el bucle for y me da: 18446744073709552000 q creo q falla xq con numeros tan grandes tiende al redondeo.

P.D.--->Uso Microsoft Visual C++ y en ste compilador los double tienen 64 bits
P.D2.--->Acabo de mirarlo y el redondeo empieza a partir de 2^56, q al dar el siguiente paso supongo q ya considera minima la cantidad q se desperdicia.

Salu2
Volver arriba
Ver perfil del usuario Enviar mensaje privado
Pato_SZ



Registrado: 26 Oct 2004
Mensajes: 9

MensajePublicado: 04/11/2004 6:00 pm Responder citando
Título:

quique:
Por lo del tamaño. Usé long double y en mi maquina me ocupa 10 bytes o 80 bits (obvio) y el maximo numero positivo posible para almacenar en una variable de ese tipo es 604462909807314587353087 lo que es mucho mayor a 18446744073709551616 a si que no veo por que no puedo representar el numero que quiero.

Lo otro que dices sobre que "pow" esta definida para los tipo float, yo tenia entendido (con lo poco y nada que se sobre el leguaje) que era para los double.
Gracias
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
quique



Registrado: 30 Mar 2004
Mensajes: 720
Ubicación: Por ahí

MensajePublicado: 04/11/2004 11:48 pm Responder citando
Título:

Pato_sz, si, tienes razon: pow está definida para "double": esta variable es de tamaño mayor o igual que los 'float', pero menor o igual que los 'long double', dependiendo del compilador/librería utilizada

Así que en VC++ es de 8 bytes pero en el entorno que uso, es de 4 bytes, por lo que a los double normalmente se les llama 'float', cosa que no es cierta, sorry!

En Borland o DevC++ no se el tamaño de los double, con lo que tendría que revisar la ayuda.

Por cierto, como piensas representar el numero?

Salu2

PS.- La proxima vez, concretare entorno y compilador Wink
Volver arriba
Ver perfil del usuario Enviar mensaje privado
Pato_SZ



Registrado: 26 Oct 2004
Mensajes: 9

MensajePublicado: 05/11/2004 6:22 pm Responder citando
Título:

Quique.
¿Si una funcion esta definida para un tipo de dato basico, esa funcion en el tipo de dato derivado del basico funciona mal (por ejemplo "pow" que es para los "double" en un "long double" puede o no funcionar)?
Pregunto porque no sé.

Sobre la solución al problema: Ahun no la encuentro, pero no es muy importante porque es solo curiosidad

Gracias
Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
Mostrar mensajes anteriores:   
Publicar Nuevo Tema   Responder al Tema    Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 2 Todas las horas están en GMT - 8 Horas
Ir a página 1, 2  Siguiente

 
Saltar a:  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com, 1999-2007

Un proyecto de UrlanHeat.com