Skip to content

Instantly share code, notes, and snippets.

@parzibyte
Created January 14, 2021 05:17
Show Gist options
  • Save parzibyte/8950fac0b73481bd411d0705ae01f7d1 to your computer and use it in GitHub Desktop.
Save parzibyte/8950fac0b73481bd411d0705ae01f7d1 to your computer and use it in GitHub Desktop.
/**
* Convierte un número decimal a cualquier base
* @param numeroDecimal El número en base 10
* @param cadenaResultado Cadena en donde se almacenará el resultado, pues esta función no devuelve nada, solo coloca el resultado en la cadena indicada
* @param base La base a la que se desea convertir el número. Por ejemplo, para convertir a hexadecimal, la base es 16
* @param digitos Los dígitos que conforman la base a la que se convierte el número. Por ejemplo, para la base 16 son 0123456798ABCDEF
* @author Parzibyte https://parzibyte.me/blog
*/
void decimalACualquierBase(double numeroDecimal, char cadenaResultado[MAXIMA_LONGITUD_CADENA], const int base, const char digitos[])
{
/*
* Separar fracción y entero
* */
double parteEnteraDouble; // Temporal para modf
double parteFraccionaria;
parteFraccionaria = modf(numeroDecimal, &parteEnteraDouble);
int parteEntera = (int)parteEnteraDouble;
/*
* Declarar cadenas
* */
char cadenaParteEntera[MAXIMA_LONGITUD_CADENA] = "";
char cadenaParteFraccionaria[MAXIMA_LONGITUD_CADENA] = "";
// Realizar la conversión de la parte entera
while (parteEntera > 0)
{
int residuo = parteEntera % base;
char digito = digitos[residuo];
concatenarCharACadena(digito, cadenaParteEntera);
parteEntera /= base;
}
// Invertimos la cadena
invertirCadena(cadenaParteEntera);
// Realizar conversión de la parte fraccionaria
double sobrante;
do
{
double resultado = parteFraccionaria * base;
parteFraccionaria = modf(resultado, &sobrante);
char digito = digitos[(int)sobrante];
concatenarCharACadena(digito, cadenaParteFraccionaria);
} while (sobrante != 0);
// Concatenar finalmente la parte entera y fraccionaria en el resultado
strcpy(cadenaResultado, ""); // Limpiar cadena
strcat(cadenaResultado, cadenaParteEntera);
strcat(cadenaResultado, ".");
strcat(cadenaResultado, cadenaParteFraccionaria);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment