Dev - C++ - Ayuda con variables dinamicas

 
Vista:
sin imagen de perfil

Ayuda con variables dinamicas

Publicado por Lighuen (1 intervención) el 23/07/2017 13:12:15
Hola que tal.Quiciera saber como hacer para que las variables ,sean mas dinámicas en memoria ,puesto que necesito ,que almacenar numeros grandes ,porque lo necesito para cálculos que incluyen factoriales,potencias ,ect.
por ejemplo, hice un codigo ,para calcular potencia,y se queda sin memoria.
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
using namespace std;
 
void cuadrado(long long  int *x) {
    *x *=*x; // Le paso por referencia el numero,que esta en memoria,porque  lo necesito,que sea de esta forma
}
 
int main() {
    long long  int var = 2;
    for (long long  int bit=1;bit <=8;bit++){
        cuadrado(&var);
        cout << var <<endl;
 
    }
    return 0;
}
// La salida es hasta el numero 
/*
4
16
256
65536
4294967296
0  //aquí comienzan los problemas
0
0
*/
Cabe destacar que usaba python,pero ,en python no hay manejo de memoria,entonces uno no se preocupa por estas cosas.
Hay alguna solución .¿Esto es debido a la sobrecarga?
Desde ya muchas gracias¡¡¡¡
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
sin imagen de perfil
Val: 417
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda con variables dinamicas

Publicado por Thanatos (199 intervenciones) el 23/07/2017 18:58:22
El problema está en la capacidad de almacenamiento del tipo de dato que estás utilizando: long long int. Si ejecutas el siguiente código podrás ver el valor máximo que ese tipo de dato puede almacenar:

1
2
3
4
5
6
7
8
9
#include <iostream>
#include <limits>
 
using namespace std;
 
int main() {
    cout << "maximo long long int = " << numeric_limits<long long int>::max();
    return 0;
}


El sexto resultado que debería mostrar el programa, en lugar del cero, es: 18 446 744 073 709 551 616 y sobrepasa el límite del tipo long long int.

Para trabajar con números «grandes», podrías usar alguna librería como Multiprecision de Boost o GMP. Por ejemplo, tu programa se vería así utilizando la librería GMP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <gmpxx.h>
 
using namespace std;
 
void cuadrado(mpz_class *);
 
int main() {
    mpz_class var(2);
 
    for (int cont(1); cont <= 8; ++cont) {
        cuadrado(&var);
        cout << var.get_str(10) << '\n';
    }
 
    return 0;
}
 
void cuadrado(mpz_class *x) {
    *x *= *x;
}

Esta es la salida del programa:

salida


Te adjunto la librería GMP que utilicé para compilar el programa. La librería fue compilada con MinGW-w64 (32 bit).
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