Hola, estoy haciendo un script donde entra un argumento STRING y devuelve un argumento REAL pero pasa que... el real que devuelve es demasiado grande, e informándome por la gmcyoyo, parece ser que hay un límite, entonces he pensado.. y si corto el numero y lo retorno por partes? pero pum... no se puede retornar más de un valor, si retorno varias veces, se suplanta y nos quedamos con el último trozo solamente...
Alguna solución??
Para que entiendan mejor... estoy haciendo un conversor de cadenas ascii a enteros binarios. Y en el test, poniendo "hola", retorna 7x4=28 cifras... imaginen si alguien pone "ola k ase? petar el GM o k ase?"
xDD
GMS maneja números reales en formato de coma flotante de 32 bits, lo que significa que se pueden representar 2^32 números = 4294967296 números, que corresponde a un número con aproximadamente 10 cifras significativas. Si quieres guardar un número binario con muchas cifras, lo mejor sería que en vez de devolver un real con 28 cifras significativas como 1010110101010101010110101001, devolvieras eso mismo pero como string y adaptar tu programa para que use ese string en vez de un real con una precisión monstruosa, cosa que no es factible.
es justo lo que quiero evitar T_T
de verdad que no hay otra opción? T_T
Yo tengo entendido que GM almacena los reales como números de coma flotante de 64 bits.
http://gmc.yoyogames.com/index.php?showtopic=653938
http://gmc.yoyogames.com/index.php?showtopic=658673
Cita de: penumbra en Diciembre 04, 2015, 03:38:50 AM
Yo tengo entendido que GM almacena los reales como números de coma flotante de 64 bits.
http://gmc.yoyogames.com/index.php?showtopic=653938
http://gmc.yoyogames.com/index.php?showtopic=658673
En el apartado Data Types del manual de GMS dice:
CitarReal Numbers
real numbers are any value that is not a string, nor any of the other possible data types. So, 124, 45639.566546456, 0, -45.5 etc... are all examples of real numbers. All real numbers are stored as 32bit floating point values (even integer values), so you may experience slight rounding errors when dealing with these. For more information on this and other number related functions, please see: Reference - Real Numbers.
Al menos eso es lo que vi en el manual, pero puede ser un error de éste. Sea cual sea el caso, cuando mucho podría almacenarse un máximo de 9 caracteres de esta forma, considerando que cada caracter en ASCII ocupa 7 bits.
Cita de: kostra en Diciembre 04, 2015, 12:39:14 AM
es justo lo que quiero evitar T_T
de verdad que no hay otra opción? T_T
Depende de lo que quieras hacer con la información. Una cadena consta de varios caracteres, cada uno con su código ASCII, así que el resultado de la conversión que buscas debiera entregar no uno sino varios números. ¿Por qué debe entregar el resultado en formato binario en vez de decimal? ¿No podría la función devolver un ds_list con los números asociados a cada caracter en vez de un gigantesco número con unos y ceros?
aquí solo leo chino jajaja xD no me entero xD
Guacusio, puedes porfavor, explicarme eso de la ds_list?
e aqui mi código, no me lo roben, estoy haciendo un asset xD
[gml]///ascii_to_bin(string)
//Script by MHP Labs
outfinal = "";
for (i=1;i<=string_length(argument0);i++)
{
out = "";
cout = 0;
in = 0;
char = string_char_at(argument0,i);
in = ord(char); //97
while (in > 1)
{
bin[cout] = in mod 2;
in = in div 2;
cout++;
}
cout--;
while (cout > 0)
{
out += string(bin[cout]);
cout--;
}
out += string(in);
outfinal += string(out);
}
return(real(outfinal));[/gml]
Cita de: kostra en Diciembre 04, 2015, 03:53:03 PM
aquí solo leo chino jajaja xD no me entero xD
Guacusio, puedes porfavor, explicarme eso de la ds_list?
e aqui mi código, no me lo roben, estoy haciendo un asset xD
[gml]///ascii_to_bin(string)
//Script by MHP Labs
outfinal = "";
for (i=1;i<=string_length(argument0);i++)
{
out = "";
cout = 0;
in = 0;
char = string_char_at(argument0,i);
in = ord(char); //97
while (in > 1)
{
bin[cout] = in mod 2;
in = in div 2;
cout++;
}
cout--;
while (cout > 0)
{
out += string(bin[cout]);
cout--;
}
out += string(in);
outfinal += string(out);
}
return(real(outfinal));[/gml]
no entiendo la necesidad de convertir un codigo ascii a binario, pero pensando en tu problema que te pareceria un array o un ds_map?(ojo, si usas array asegurate de que indique tambien la cantidad total de datos, podrias reservar la posicion array[0], ya que no la usas, para guardar la longitud del array)
[gml]///ascii_to_bin(string)
//Script by MHP Labs
//outfinal = ""; esto no es necesario que lo declares ya que esto lo crearas mas adelante y no es una condicional, ademas lo necesitas como array.
contador=string_length(argument0);//te lo pongo asi para poder usar esta variable otra vez, ademas no creo que sea muy eficiente calcular a cada paso del for la longitud del string, ya que este no cambiara.
for (i=1;i<=contador;i++)
{
out = "";
cout = 0;
in = 0;
char
= string_char_at(argument0,i);
in = ord(char); //97
while (in > 1)
{
bin[cout] = in mod 2;
in = in div 2;
cout++;
}
cout--;
while (cout > 0)
{
out += string(bin[cout]);
cout--;
}
out += string(in);
outfinal= string(out);//ya que empiesas tu conteo en i=1 el array outfinal[0] esta vacio.
}
outfinal[0]= contador;//lo pongo aqui, pero tambien puede estar al principio del codigo
return(real(outfinal));[/gml]
hey si lo publicas no olvides los creditos a todos :D
ps: no revise tu codigo completamente, solo te modifique lo que pediste.
El código que pusiste tiene algunos errores en las condiciones de los while: debe ser >= y no > o no estarás considerando el bit de peso más alto en el cálculo. Tampoco corresponde la parte donde haces "out += string(in);" que le agrega una cifra de más al número, ni es necesario evaluar string(out) si out ya es un string.
Respecto a las ds_list, a lo que me refiero es a que dentro del script generes una lista y guardes en ella un número por cada letra, y luego retornes el índice de la lista al final del script. Sería algo como esto:
///ascii_to_bin(string)
//Script by MHP Labs
var lista;
lista=ds_list_create();
outfinal = "";
for (i=1;i<=string_length(argument0);i++)
{
out = "";
cout = 0;
in = 0;
char[i] = string_char_at(argument0,i);
in = ord(char[i]);
while (in >= 1)
{
bin[cout] = in mod 2;
in = in div 2;
cout++;
}
cout--;
while (cout >= 0)
{
out += string(bin[cout]);
cout--;
}
ds_list_add(lista,real(out));
}
return lista;
Luego, para llamar al script y rescatar los números binarios asociados a cada letra, por ejemplo para mostrarlos en un mensaje, puedes hacer esto:
var l,i,r;
r="";
l=ascii_to_bin("Hola ke ase");
for(i=0;i<ds_list_size(l);i+=1)
r+=string(l[| i])+"#";
show_message(r);
ds_list_destroy(l);
No hay que olvidar destruir la lista luego de que no se necesite.
Tengo curiosidad por saber cómo es que un script así te podría ser útil, ¿por qué necesitas transformar un texto a números binarios?