Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Cómo convertir un número binario al tipo Real (https://www.clubdelphi.com/foros/showthread.php?t=54258)

kbaby 12-03-2008 19:56:26

Cómo convertir un número binario al tipo Real
 
Hola !! Que tal... cuanto tiempo sin pasarme =D eso es bueno, es porque progreso sin problems.
Tengo una duda para vosotros ;) jejejeje... a ver la suelto...

Quisiera un codigo, o bueno saber como a salido ese "codigo" para hacer una conversion de binario a un numero real ^^ Utilizando edits o tabla... me da igual ^^

No se si me explico pero bueno graaaaaacias.

PD1: Cambiad el titulo que no sabia cual ponedle.

ixMike 12-03-2008 20:25:14

Hola :)

Según mi ayuda de Delphi:

Cita:

Empezado por Ayuda de Delphi
A 6-byte (48-bit) Real number is divided into three fields:

1 39 8
[s| f | e ]
msb lsb msb lsb

The value v of the number is determined by the following:

if 0 < e <= 255, then v = (-1)s * 2(e-129) * (1.f).
if e = 0, then v = 0.


The Real type can't store denormals, NaNs, and infinities. Denormals become zero when stored in a Real, and NaNs and infinities produce an overflow error if an attempt is made to store them in a Real.

Según esto, el primer bit es para el signo, los siguiente 39 son la mantisa, y los últimos 8 el exponente.

Si recuerdo bien lo que me enseñaron en clase de informática, el valor del número sería f·10^(e-129) (escrito en notación científica).

En trucomanía tienes un par de trucos para pasar Integer<->Binario:
http://www.q3.nu/trucomania/truco.cgi?122&esp
http://www.q3.nu/trucomania/truco.cgi?187&esp

Lo que no sé cómo hacer es extraer esos 39 bits (cuarenta tomando el signo) por separado para pasarlos a binario, y después hacerlo con los otros 8 :(

¿Alguien que aporte cómo, o que me corrija si me equivoco?

kbaby 12-03-2008 20:48:46

Buaaaah a llorar xD yo se hacerlo con cuentas ^^

Mike cambie de blog xD www.lavidaesbella.motime.com xD por si te interesa ^^

Te gusto mi felicitacion?

Jjajaja tengo otra pregunta ya de contenido informatico ^^ me he bajado el todo en uno v8... y son 2 dvd de 8 gb cada uno por lo visto. ¿Como lo grabo? Si mi dvd tiene 4,7 GB !!! XD

ixMike 12-03-2008 20:55:41

Hay DVDs de 8'5 GB e incluso de 17 GB (doble capa, doble cara). Y sí, me llegó la felicitación :) gracias.

kbaby 12-03-2008 21:13:33

¿No hay manera de poderlo hacer en DVD normales? Jajajaja.

kbaby 12-03-2008 21:16:52

¿Podrías hacerme un favor? He visto los codigo de: http://www.q3.nu/trucomania/truco.cgi?122&esp pero vamos... ni idea de como usarlos porque hay "comandos" que no he estudiado aún. Si podrías hacerme un programa a través de ese codigo y yo lo veo, lo estudio y lo aprendo. =) Uno sencillito. Jajaja

PD: Soy pesado (por eso digo que si estoy en un foro, temblad :p)

ixMike 12-03-2008 21:26:05

No utliza ningún "comando" extraño, tan sólo es el código de una función recursiva (bueno, hay muchas, distintas formas de hacer lo mismo) a la que se pasas un integer y te devuelve un string que es el número en binario.

Si no entiendes lo que hace exactamente después de examinarla, pues entonces déjala para un futuro. Utiliza algunos operadores un tanto atípicos, al menos para mí (vale, ni yo entiendo el código :o).

Y para que no me digan nada por ahí, te digo que en Delphi no hay "comandos", pero sí funciones, métodos, tipos, objetos, eventos, operadores...


A todo esto... ¿qué es lo que quieres hacer exactamente?

kbaby 12-03-2008 21:36:52

Quiero un programa que haga esto, lo necesito locamente para mañana a las 8:30... así que imagínate xD jajaja.

ixMike 12-03-2008 21:50:32

¡Será posible! Deberías haber empezado un poco antes, ¿no?

A ver qué te parece esto (no sé si funciona correctamente):

Código Delphi [-]
Function RealToBin(R: Real): String;
type
  TBReal = record
    B1, B2, B3, B4, B5, B6: Byte; //una estructura que ocupa lo mismo que un Real y puedes accederla byte a byte
   end;
  PBReal = ^TBReal; //Puntero a ese tipo
var
  V: PBReal;
  S: String;
begin
  V:=@R;
  S:=IntToBin(V^.B1, 8) + IntToBin(V^.B2, 8) + IntToBin(V^.B3, 8) + 
     IntToBin(V^.B4, 8) + IntToBin(V^.B5, 8) + IntToBin(V^.B6, 8);
  Result:=S;
end;


Espero que te sirva (mira a ver si puedes hacerlo tú con un puntero a una matriz, en vez de a una estructura ;)).

Salu2.

kbaby 12-03-2008 22:23:56

Pero.. todo esto donde lo meto? En un button, en el fondo del programa... ¿donde? :S Soy un no-va-to xD con todas sus letras.

egostar 12-03-2008 22:28:34

Cita:

Empezado por kbaby (Mensaje 272812)
Quiero un programa que haga esto, lo necesito locamente para mañana a las 8:30... así que imagínate xD jajaja.

Cita:

Empezado por kbaby (Mensaje 272826)
Pero.. todo esto donde lo meto? En un button, en el fondo del programa... ¿donde? :S Soy un no-va-to xD con todas sus letras.

Hola amigo kbaby, como se que tienes potencial y que no te da miedo entrarle a los golpes, pienso que puedes solucionar esa duda existencial que tienes, prueba las opciones que se te ocurran y decide donde estará mejor ;)

Salud OS

kbaby 12-03-2008 22:30:24

Es que no entiendo nada de lo que hay en el codigo, tenemos un nivel muy bajo, lo ultimo que dimos fue el: if, for y copy

Imagínate.

Por cierto... egostar... ¿tu jugabas a habbo?

egostar 12-03-2008 22:36:52

Cita:

Empezado por kbaby (Mensaje 272829)
Es que no entiendo nada de lo que hay en el codigo, tenemos un nivel muy bajo, lo ultimo que dimos fue el: if, for y copy

Imagínate.

Es que es una funcion que puedes llamar desde cualquier parte de tu forma, ya sea un boton o un evento, la puedes llamar de esta manera

Código Delphi [-]
VariableString := RealToBin(19.25);

Cita:

Empezado por kbaby (Mensaje 272829)
Por cierto... egostar... ¿tu jugabas a habbo?

Pues no amigo kbaby ni lo conozco, cuando era joven como tú no existia ni siquiera la computadora, las TV eran blanco y negro, no existian los controles remotos, jugaba con carritos de madera y soldaditos de plomo..... :D:D:D

Salud OS

kbaby 12-03-2008 22:38:33

Mejor lo dejo... no tengo ni idea de que es
VariableString := RealToBin(19.25);

Es que en ese juego había un egostar :P por eso me sonaba jujuju.

Gracias por la ayuda.

ixMike 12-03-2008 23:07:03

Cita:

Empezado por kbaby (Mensaje 272832)
Mejor lo dejo... no tengo ni idea de que es
VariableString := RealToBin(19.25);

¿Estás seguro de que eres el mismo kbaby que con el que yo traté hace unas semanas? Porque me parece que entonces sabías mas :rolleyes:

VariableString es una variable de tipo string, a la que se asigna el valor que retorna la función RealToBin (creada por mí) cuando le pasas el parámetro 19'25. RealToBin la puedes poner en varios sitios; te recomiendo en implementation.


Ahora tengo que pedir disculpas por un pequeño despiste que he tenido, te he dado la función inversa a la que buscabas :o:

Cita:

Empezado por kbaby
hacer una conversion de binario a un numero real

Esto lo que hace es coger un número real y pasarla a binario ^^

¿Estás seguro de que el número tiene que ser real? Porque con un entero la cosa queda muy fácil, pero con un real... mucho nivel para alumnos que sólo han visto if, for y copy.


Bueno, entonces consideremos el caso binario a entero. En los enlaces que te he puesto al principio hay una función que lo hace, pero vamos a pasar de ella, y vas a hacer tú mismo el método ;).

Para empezar, ¿cómo vas a recibir ese número binario? Seguramente lo escribirás en un edit, bueno, eso se espera. Ok.

Olvidémonos por un momento de la informática y dime: ¿sabes convertir un número en binario a decimal? Es decir, ¿sabes que 1010101010 es 682? Espero que sí :D: vas recoriendo los dígitos binario, de derecha a izquierda, sumando potencias de base 2.

Vale, ahora, ¿cómo aplicar este sistema en tu código Delphi? Veamos:

-Recorrer los carácteres de derecha a izquierda: El texto del edit se guarda en su propiedad Text, de tipo string. Si has estudiado ;) sabrás que se pueden acceder a los distintos carácteres de un string como si de una matriz de Char se tratara. Así, para leer el 3er carácter harás:
Código Delphi [-]
const
  Cadena = 'ABCDEF';
var
  TercerCaracter: Char;
begin
  TercerCaracter:=Cadena[3];
  //TercerCaracter ahora debe valer "C"
end;

A diferencia de otros tipos o lenguajes, en Delphi el string comienza en el carácter 1, y no en el 0.

Pero, para recorrer de derecha a izquierda, ¿cómo hacerlo? Necesitarás un bucle (por la repetición) y saber cuántos carácteres tienes en el edit. Para lo segundo tienes la función Lenght (mira en la ayuda de Delphi para aprender cómo se usa, aunque es muy muy simple). Así, para recorrer todos los carácteres del edit haremos:

Código Delphi [-]
var
  n: integer;
begin
  for n:=Length(Edit1.Text) downto 1 do
    begin
    //Código
    end;
end;

Vale, ahora ya sólo queda calcular el número en sí. Pues con todo lo que sabemos, lo único que falta saber es cómo calcular una potencia; la función Power de la unit math nos lo da.

Toma, el código que tanto ansiabas:

Código Delphi [-]
var
  n, Numero: Integer;
begin
  Numero:=0; //Damos un valor inicial al número
  for n:=Lenght(Edit1.Text) downto 1 do
    begin
      If Edit1.Text[n]='1' then //Si el número es un uno
       Inc(Numero, Power(2, Length(Edit1.Text)-n));
    end;
ShowMessage('El binario '+Edit1.Text' equivale al número entero '+IntToStr(Numero));
end;

Espero que esté lo suficientemente claro. Cualquier función que no sepas para qué sirve, puedes buscarla en la ayuda de Delphi. Y recuerda añadir math a la uses.


Salu2.

kbaby 12-03-2008 23:11:20

Dios! Que pasanda de escribir. Pues sí soy el mismo kbaby con mucho sueño pero bueno xD y con pocas ganas porque estoy estudiando a petrarca a la vez así que imagínate... =) Petrarca, fray luis de leon ... etc

La funcion Length si la he visto, por lo demás.. nothing de nothing xD. Voy a intentar ir captando pasito a pasito , lo que me has escrito.



Volveré... xD

PD: Nosotros no estudiamos, simplemente vamos viendo "funciones" poco a poco, como te comenté, primero el for, luego if, luego copy... etc etc xD
PD2: Lo que quiero es pasar de un nº binario (10101010101010) a un numero normal (real supongo) por ejemplo 69 :P

kbaby 12-03-2008 23:19:44

Me he atrancado aquí:

const
Cadena = 'ABCDEF';
var
TercerCaracter: Char;
begin
TercerCaracter:=Cadena[3];
//TercerCaracter ahora debe valer "C"
end;



ABCDEF ... supongo que ese código ira en un button... pero como voy a poner en ese button ABCDEF xD

PD: Soy... principiante (mas por debajo)

PD2: He leído el código completo y e ido transladando todo a lo que yo sé y me atranqué en:
If Edit1.Text[n]='1' then //Si el número es un uno
Inc(Numero, Power(2, Length(Edit1.Text)-n));


Edit1.Text[n] -> No lo he visto nunca después de text añadir [n] ... T_T

ixMike 12-03-2008 23:46:29

Cita:

Empezado por kbaby (Mensaje 272842)
ABCDEF ... supongo que ese código ira en un button... pero como voy a poner en ese button ABCDEF xD

"ABCDEF" es sólo una constante que he declarado como ejemplo.


Cita:

Empezado por kbaby (Mensaje 272842)
PD: Soy... principiante (mas por debajo)

Ni eso, eres un alumno :D

Cita:

Empezado por kbaby (Mensaje 272842)
Edit1.Text[n] -> No lo he visto nunca después de text añadir [n]

No es cuestión de Text, sino de cualquier variable o propiedad o función de tipo String, puedes acceder al caracter n como ya te he explicado.

Dile a tu profesor(a) que os enseñe un poco más de lo básico antes de empezar con nuevas funciones ;)


Salu2, y que vaya bien con la literatura :)

kbaby 12-03-2008 23:50:20

Al fin termine literatura xD Voy a intentar hacer eso de binario a decimal de esta forma.

Guardare la longitud del binario en una variable cantidad
Hare un for para que se repita tantas veces como esa cantidad
  1. Pero aquí está la cuestion: ¿cómo le digo a ese for, que tiene que ir sumando 1+2+4+8...) "Me explico mal xD"
  2. Y cuando aparezca un 0 en el binario... pues cojeré un IF y si sale 0, le diré que pasé de él, que lo discrimine. (Cómo hacer eso es otro gran logro) xD.

ixMike 12-03-2008 23:59:53

Volvamos a ver mi código:

Código Delphi [-]
var
  n, Numero: Integer;
begin
  Numero:=0; //Damos un valor inicial al número
  for n:=Lenght(Edit1.Text) downto 1 do
    begin
      If Edit1.Text[n]='1' then //Si el número es un uno
       Inc(Numero, Power(2, Length(Edit1.Text)-n));
    end;
ShowMessage('El binario '+Edit1.Text' equivale al número entero '+IntToStr(Numero));
end;

Lenght(Edit1.Text) es lo que tú quieres llamar cantidad, pero si así te aclaras mejor, pues entonces hazlo :)

If Edit1.Text[n]='1' then significa "si el carácter n es uno entonces...". Así es como discrimino al cero.

La función Inc incrementa la variable Numero en la cantidad que se le dice en el segundo parámetro. Estas dos líneas hacen lo mismo:

Código Delphi [-]
Inc(Numero, 2);
Numero:=Numero + 2;

Lo que hago es incrementarlo la potencia de dos, teniendo en cuenta que el exponente es el orden del carácter leído, comenzando por la derecha y desde cero. Si te fijas, cantidad - n ya hace esto (al principio vale 0, y al final cantidad - 1)

A ver si de esta forma te aclaras más:

Código Delphi [-]
var
  n, Cantidad, Numero: Integer;
begin
  Numero:=0; //Damos un valor inicial al número
  Cantidad:=Lenght(Edit1.Text); //Indicamos la cantidad
  for n:=Cantidad downto 1 do
    begin
      If Edit1.Text[n]='1' then //Si el número es un uno
       Numero:=Numero + Power(2, Cantidad - n);
    end;
ShowMessage('El binario '+Edit1.Text' equivale al número entero '+IntToStr(Numero)); //Mostramos un mensaje con los datos
end;

¿Mejor así? :)

Salu2.

kbaby 13-03-2008 15:17:40

Hola! Como nadie sabíamos hacerlo nos dijo que no nos explicó que se hacía con el for con downto ... pero bueno mañana tengo la posibilidad de entregarlo. He visto tu código y donde pone lenght ....¿no sería length?

En delphi, puse un edit y un button y metí el code enel button. Y cuando le doy a F9 me señala la linea donde dice Power diciendo de error: Undeclared identifier: 'Power'. Y luego otro error en la misma línea de que falta un ; porque dice Missing Operator semiclon xD


Siento ser así de pasado, pero bueno.... es que quiero aprender y quiero aprender mucho más... necesito hacer un proyecto para junio ! Y quiero empezar ya en mi casa.

kbaby 13-03-2008 15:20:50

He buscado en Delphi help, y me dice que la función Power es:
Power(const Base, Exponent: Extended): Extended;

¿No faltan las palabras en negrita?

Lepe 13-03-2008 15:25:41

Es obvio que lo ha escrito de memoria, así que es fácil cometer errores.

lenght es uno de mis errores más comunes :D

En la misma ayuda, te dice que power está en la unidad Math, por ende, tienes que poner :

uses Math;

para que compile.

Lo del punto y coma, pues lo corrijes y listo ;)

Las palabras en negritas, son la declaración de tipos de la función, es decir, te dice que recibe un tipo de dato en coma foltante (Extended), aunque un integer es totalmente compatible con ellos.

La palabra "const" viene a decir que esos parámetros no se van a modificar dentro de la función "power".

Saludos

kbaby 13-03-2008 15:27:56

No se donde poner uses Math;

Lo siento... xD mi inexperiencia... es 100%

Gracias por la rapidez tio.

Delphius 13-03-2008 15:31:52

kbaby,
una unidad viene así:

Código Delphi [-]
unit Unit1;

interface

uses
  // aqui viene la lista!

type

...

implementation

...

end;

Lee la ayuda kbaby... allí está todo... además si emplearas el buscador de los foros llegarías a hilos en donde se han expuesto estas preguntas.

Saludos,

kbaby 13-03-2008 15:36:04

Lo intento... pero como en esas ayudas viene información demás.. pues me es imposible encontrar la explicación. Necesito un manual que empieze desde cero.

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, math;

Aquí puse lo de math, pero me sigue señalando la linea donde está power.... diciendome tipo incompatible integer y extended y mission operartor semiclon...


pd: lo siento... :(

ixMike 13-03-2008 15:44:24

Missing operator or semicolon te sale seguramente porque te falta un puntocoma.

El otro error es porque has puesto un extended donde va un integer.

Desde luego necesitas un manual para empecar desde cero :D, en el FTP del club tenemos La cara oculta de Delphi 4, que va desde cero hasta experto ;)


Salu2.

kbaby 13-03-2008 15:44:28

Recomendadme un libro, que voy a salir a las 17.00 a comprarme un manual. Decidme titulos bueno porfavor. :) Quiero aprenderlo a fondo.

kbaby 13-03-2008 15:45:58

Pero... como corrigo esos errores :S yo veo todo con ;

Es que damos muy pocas cosas en informática :S (a veces digo que porque no os venís de profesores... xD)

Delphius 13-03-2008 15:50:49

Cita:

Empezado por kbaby (Mensaje 272988)
Pero... como corrigo esos errores :S yo veo todo con ;

Es que damos muy pocas cosas en informática :S (a veces digo que porque no os venís de profesores... xD)

kbaby, recuerda que no estamos a tu lado no podemos ver lo que hiciste.
Si expusieras el código que tienes hecho, con tus correcciones, podríamos saber que haces (o no haces).

Si estás dispuesto a comprar libros, Busca "La Biblia de... " de Marcos Cantú.

Saludos,

ixMike 13-03-2008 15:52:20

Cita:

Empezado por kbaby (Mensaje 272988)
Pero... como corrigo esos errores :S yo veo todo con ;

Pues el sistema del foro es que nos pongas el código que tienes para ver cómo podemos ayudarte :)
Si no es cosa de ";" será algún operador (como algo:=otracosa;)

kbaby 13-03-2008 15:53:42

Aquí esta lo que tengo:

Cita:

procedure TForm1.Button1Click(Sender: TObject);
var
n, Cantidad, Numero: Integer;
begin
Numero:=0;
Cantidad:=Length(Edit1.Text);
for n:=Cantidad downto 1 do
begin
If Edit1.Text[n]='1' then
Numero:=Numero + Power ( 2, Cantidad - n);
end;
ShowMessage('El binario '+Edit1.Text' equivale al número entero '+IntToStr(Numero));

end;

end.
Y sí, voy a comprar un libro, voy a ir viendo esos que me informáis.

maeyanes 13-03-2008 16:02:59

Hola...

Aquí tu código corregido... checa el comentario...

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
var
  n, Cantidad, Numero: Integer;
begin
  Numero := 0;
  Cantidad := Length(Edit1.Text);
  for n := Cantidad downto 1 do
    If Edit1.Text[n] = '1' then
      Numero := Numero + Power(2, Cantidad - n);
  // En esta línea tenías el error, un operador + que faltaba
  ShowMessage('El binario ' + Edit1.Text + ' equivale al número entero ' + IntToStr(Numero))
end;

Saludos...

kbaby 13-03-2008 16:06:32

Madre mía!!! Por esa cosa me sale todo eso... dios muchas gracias, Ahora queda el último error, me sale:
Incompatible types: 'Integer' and 'Extended'.
Y me señala la línea:
Numero := Numero + Power(2, Cantidad - n);


¿Por qué?


PD: Gracias.

maeyanes 13-03-2008 16:13:36

Hola...

El problema está en que Número es una variable de tipo Integer y la función Power devuelve un valor del tipo Extended, entonces, al hacer:

Código Delphi [-]
Numero + Power(2, Cantidad - n);

El resultado se convierte automáticamente en Extended y ese valor no lo puedes asignar a la variable Numero, de ahí que te de ese error...

Prueba haciendo esto:

Código Delphi [-]
var
  n, Cantidad: Integer;
  Numero: Extended;



Saludos...

kbaby 13-03-2008 16:19:19

Nunca use lo de Extended
Ahora sale otro error aquí:

Código Delphi [-]
IntToStr(Numero))



Debido a que numero antes era integer... que tengo que poner en lugar de IntToStr. Nunca he estudiado (por ahora) ese tipo de variable.

maeyanes 13-03-2008 16:25:19

Hola...

Bueno si, ahora Numero no es de tipo Integer y es por eso que ya no puedes usar esa función..

Ahora tienes que usar: FloatToStr


Saludos...

kbaby 13-03-2008 16:34:07

Otra duda xD ¿float no era para cuando utilizabas una variable real?

Ya funciona! Muchas gracias a todos (aora vengo voy a ir a la libreria a comprarme eso) No cerreis el post, que ahora os comento cosas del libro y doy mas gracias a todos).

maeyanes 13-03-2008 16:42:07

El tipo Extended es un tipo de datos Real...

Por cierto, en Delphi ya no se usa el tipo de datos Float, se usa Double en su lugar...



Saludos...

ixMike 13-03-2008 16:46:10

Float, Double, Extended, Real, Currency y Comp (y no sé si alguno más) son distintos tipos de datos que sirven para almacenar números reales. La diferencia entre ellos es la cantidad de memoria que ocupan (y por tanto, la precisión que tienen). Aunque me parece que algunos son equivalentes a otros y sólo se mantienen por compatibilidad.


La franja horaria es GMT +2. Ahora son las 20:59:56.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi