Foros del Web » Programando para Internet » PHP »

Calcular números decimales a bases elevadas

Estas en el tema de Calcular números decimales a bases elevadas en el foro de PHP en Foros del Web. Hola a todos, alguien conoce algun script o alguna forma de convertir un numero decimal muy alto por ej: "54154657946124578963215784" a una base alta por ...
  #1 (permalink)  
Antiguo 28/03/2010, 01:59
 
Fecha de Ingreso: diciembre-2009
Mensajes: 28
Antigüedad: 14 años, 4 meses
Puntos: 0
Calcular números decimales a bases elevadas

Hola a todos, alguien conoce algun script o alguna forma de convertir un numero decimal muy alto por ej: "54154657946124578963215784" a una base alta por ejemplo 39, 43 o 70?

Por ejemplo en esta página:

http://www.easysurf.cc/cnver17.htm

En el formulario final puede calcular esas bases, por ejemplo del numero anterior a base 43 es: "17,1,41,3,8,10,23,17,15,14,37,27,13,36,37,36" las comas separan el valor de cada numero resultante. Algo asi deseo calcular a traves de PHP o algo parecido, lo importante es que pueda calcular en la base que yo deseo, alguien sabe como hacerlo?

Saludos
  #2 (permalink)  
Antiguo 28/03/2010, 03:56
Avatar de AnesGy  
Fecha de Ingreso: mayo-2009
Mensajes: 518
Antigüedad: 14 años, 11 meses
Puntos: 19
Respuesta: Calcular números decimales a bases elevadas

Capaz que usando decimales en vez de enteros te funciona. El decimal (double) creo que llega en PHP hasta x10^308 y eso es mucho.
__________________
Si alguna vez parece que soy grosero, pido perdón, es un intento fallido de ser directo.

AnesGy SD. Name it, Get it
  #3 (permalink)  
Antiguo 28/03/2010, 11:16
 
Fecha de Ingreso: diciembre-2009
Mensajes: 28
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Calcular números decimales a bases elevadas

Cita:
Iniciado por AnesGy Ver Mensaje
Capaz que usando decimales en vez de enteros te funciona. El decimal (double) creo que llega en PHP hasta x10^308 y eso es mucho.
Hola estuve buscando sobre el decimal double y encontre algunas informaciones como esta:

http://www.tuwebdeinformatica.com/Crearwebs/mysql/tipos_de_campos.html

pero no en general no me explican como se usa, yo no tengo conocimientos avanzados en PHP, por eso por favor le pediria que me de un pequeño ejemplo del código como podria tal vez funcionar para asi tener yo una referencia de como usarlo.

Aparte deseo comentar que en mi busqueda encontre sobre la libreria gmp:

http://www.php.net/manual/en/function.gmp-init.php

en changelog dice: "The base was extended from 2 to 36, to 2 to 62 and -2 to -36", en mi servidor ya hice que instalaran en gmp por si acaso, pero esa frase que dicen no se como usarlo en bases altas, por ejemplo probe esta funcion:

Código:
<?php

function gmp_convert($num, $base_a, $base_b)
{
       return gmp_strval ( gmp_init($num, $base_a), $base_b );
}

?>
pero no me convierte en bases mayores que 36, o existe otra forma de convertir las bases de 2 a 62 como dice su mensaje?, ayuda porfavor....

Saludos
  #4 (permalink)  
Antiguo 28/03/2010, 11:20
Avatar de AnesGy  
Fecha de Ingreso: mayo-2009
Mensajes: 518
Antigüedad: 14 años, 11 meses
Puntos: 19
Respuesta: Calcular números decimales a bases elevadas

Acabo de entender a que te referías, un sec que te respondo. Perdona por la respuesta anterior.

Para convertir dicimal a una base alta es relativamente simple.

Primero tienes que crear un índice de símbolos. Por ejemplo el decimal tiene la siguiente equivalencia ('1' es un símbolo y 1 es un valor):

'0'->0, '1'->1, '2'->2, ... , '9'->9

El Hexadecimal tiene algo parecido solo que:

'0'->0, '1'->1, '2'->2, ... , '9'->9, 'A'->10, ... ,'F'->16

Bueno pues tu tienes que crearte un índice con valores de 39, 33, 70 carácteres. Cual es tu problema, que 70 es un número increíble de carácteres y o usas las tildes y los símbolos raros, o vas a tener que repeitr números, que es lo que hace la página (cada conjunto 17, es como un símbolo que vale 17).

Te voy a explicar el sistema para este último método que no necesita que la base sea pequeña, ni definir el índice.

Entonces definimos la base, por ejemplo, la enesimal (n)

Código PHP:
Ver original
  1. funciton base_enesimal($num,$n=70){ //Esto es una función que pasa el número $num
  2.  //a la base enesimal (siendo el valor por defecto $n=70.
  3.  $result = "";
  4.  while($num > 0){
  5.   $result = ($num &#37; $n).",".$result; //Esto añade el carácter seguido de una , al inicio de la cadena
  6.  $num = intval($num/$n); //Esto modifica el número que usamos para quitar el carácter que hemos extraido.
  7.  }
  8.  return substr($result,0,-1); //esto quita la coma que aparecería al final y devuelve el resultado.
  9. }

Luego para deshacer el cambio se usa:

Código PHP:
Ver original
  1. funciton enesimal_a_decimal($str,$n=70){
  2.  $result = 0;
  3.  $str = explode(",",$str); //dividimos la cadena en sus carácteres
  4.  $j = 0;
  5.  foreach($str as $i) $result += $i*pow($n,$j); //esto invierte el algoritmo.
  6.  return $result;
  7. }
__________________
Si alguna vez parece que soy grosero, pido perdón, es un intento fallido de ser directo.

AnesGy SD. Name it, Get it

Última edición por AnesGy; 29/03/2010 a las 02:06 Razón: Terminar de añadir el código.
  #5 (permalink)  
Antiguo 28/03/2010, 13:40
 
Fecha de Ingreso: diciembre-2009
Mensajes: 28
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Calcular números decimales a bases elevadas

Hola, estuve probando el codigo, y por ejemplo convertir un decimal alto a base 39:

Código:
$num = "6220737792000";
echo base_enesimal($num,$n=39);
me imprime:

0.153846153846,6.5641025641,256.025641026,9985.102 5641,389419.641026,15187366.1026,1595060972310

cuando deberia imprimir:

1,6,12,34,21,22,36,38,30

No veo como usar la funcion que propone o tal vez comprendi mal.

En esta página:

http://theserverpages.com/php/manual/en/function.base-convert.php

este código:

Código:
<?php
// Decimal > Custom
function dec2any( $num, $base=62, $index=false ) {
   if (! $base ) {
       $base = strlen( $index );
   } else if (! $index ) {
       $index = substr( "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" ,0 ,$base );
   }
   $out = "";
   for ( $t = floor( log10( $num ) / log10( $base ) ); $t >= 0; $t-- ) {
       $a = floor( $num / pow( $base, $t ) );
       $out = $out . substr( $index, $a, 1 );
       $num = $num - ( $a * pow( $base, $t ) );
   }
   return $out;
}
?>
Es lo mas similar a lo que deseo, lo importante es que me convierta un numero decimal a otra base usando los "simbolos" o como hace el script (http://www.easysurf.cc/cnver17.htm) con numeros separados con comas. El problema con este código de arriba es que convierte mal los numeros decimales muy altos, como si se bloqueara, es decir si pongo:

Código:
$num = 62207377920022154654512;
echo dec2any($num,$base=39,$index=false );
ó

Código:
$num = 62207377920022154651551;
echo dec2any($num,$base=39,$index=false );
me imprime 3bw7put2gwp0ge8 en ambos casos a pesar que los numeros decimales son diferentes.

espero hasta ahora poder explicarme lo que necesito... convertir un numero entero de base decimal a otro de base superior a 36, a partir de numeros enteros de base decimal muy altos, me pregunto si un javascript puede hacerlo porque no puede hacerlo PHP con numero muy altos?....

Tal vez pueden arreglar este codigo php para que funcione con numeros muy altos?

Saludos
  #6 (permalink)  
Antiguo 28/03/2010, 16:09
Avatar de AnesGy  
Fecha de Ingreso: mayo-2009
Mensajes: 518
Antigüedad: 14 años, 11 meses
Puntos: 19
Respuesta: Calcular números decimales a bases elevadas

Al menos prueba la alternativa que te di.
__________________
Si alguna vez parece que soy grosero, pido perdón, es un intento fallido de ser directo.

AnesGy SD. Name it, Get it
  #7 (permalink)  
Antiguo 28/03/2010, 16:55
 
Fecha de Ingreso: diciembre-2009
Mensajes: 28
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Calcular números decimales a bases elevadas

Estimado AnesGy, si probé tu alternativa es mas puse lo que me salia:

0.153846153846,6.5641025641,256.025641026,9985.102 5641,389419.641026,15187366.1026,1595060972310

Por eso mencione que tal vez no te haya entendido como funciona tu funcion, me podrias decir porque sale tantos numeros con tu funcion? pues no se aparece en nada a lo que necesito, o tal vez de esos numeros tengo que procesar algo mas para obtener lo que necesito?
  #8 (permalink)  
Antiguo 28/03/2010, 20:45
 
Fecha de Ingreso: diciembre-2009
Mensajes: 28
Antigüedad: 14 años, 4 meses
Puntos: 0
Respuesta: Calcular números decimales a bases elevadas

Hola a todos, tal vez paresca muy sencillo pero logre entender eso del gmp, asi que tuve que actualizar mi php a 5.32 y usar la libreria gmp con este codigo:

Código:
echo gmp_strval($numeroentero,70);
Eso era todo ;) , Gracias.
  #9 (permalink)  
Antiguo 29/03/2010, 02:13
Avatar de AnesGy  
Fecha de Ingreso: mayo-2009
Mensajes: 518
Antigüedad: 14 años, 11 meses
Puntos: 19
Respuesta: Calcular números decimales a bases elevadas

En mi código hay un % que no se muestra, no se por qué, por algún motivo el parser de este foro lo traduce por su representación HTML. El operador % devuelve el módulo o resto de la división. Me parecía raro que te salieran decimales porque mi código sólo funciona con integers, por eso pense que era otro XD.

Aparentemente no vi el fallo.

De todos modos, creo haber visto tu fallo, yo $num es un número no una cadena, y luego que una función diga $n=70 sólo indica que el parámetro es opcional y que si no se proporciona dicho parámetro se sobreentendrá 70, no que tengas que poner $n=39.

Código:
echo base_enesimal(6220737792000,39);
Te pongo el código completo sin la etiqueta esa del enhancer porque mete carácteres extraños:

Código:
function base_enesimal($num,$n=70){ //Esto es una función que pasa el número $num
 //a la base enesimal (siendo el valor por defecto $n=70.
 $result = "";
 while($num > 0){
  $result = ($num%$n).",".$result;//Esto añade el carácter seguido de una , al inicio de la cadena
  $num = intval($num/$n); //Esto modifica el número que usamos para quitar el carácter que hemos extraido.
 }
 return substr($result,0,-1); //esto quita la coma que aparecería al final y devuelve el resultado.
}
function enesimal_a_decimal($str,$n=70){
 $result = 0;
 $str = explode(",",$str); //dividimos la cadena en sus carácteres
 $j = count($str);
 for($i=0;$i<$j;$i++){
  $result += intval($str[$i])*pow($n,($j-$i-1)); //esto invierte el algoritmo.
 }
 return $result;
}
echo base_enesimal(6220737792000,39);
De todas maneras, estaba probando tu número y no me daba el valor, eso es porque el número debe estar superando el máximo de longitud del integer, y lo está truncando.
__________________
Si alguna vez parece que soy grosero, pido perdón, es un intento fallido de ser directo.

AnesGy SD. Name it, Get it

Última edición por AnesGy; 29/03/2010 a las 02:25

Etiquetas: bases, calculadora
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 13:19.