Autor Tema: Como almacenar un dato tipo "float" en una variable de tipo "entero"  (Leído 3236 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado jgpeiro06

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 276
Hola a todos
Me ha surgido un pequeño problema, tengo que almacenar datos de distintos tipos en una pila y no se muy bien como hacerlo.
long32 stack[10];
long32 valor_entero = 10;
float32 valor_float = 12.6;
Cuando meto el valor_entero en el stack[] no hay problema, pero cuando introdzco el valor_float automaticamente lo convierte a long32 y al volver a leerlo como float vale 12.0
No se que hacer para evitar la conversion automatica. ¿conoceis alguna manera?¿quizas utilizando punteros?


Desconectado RICHI777

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1498
Re: Como almacenar un dato tipo "float" en una variable de tipo "entero"
« Respuesta #1 en: 07 de Marzo de 2008, 17:35:35 »
Crea el array de float
float32 stack[10];

Saludos !

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
Re: Como almacenar un dato tipo "float" en una variable de tipo "entero"
« Respuesta #2 en: 07 de Marzo de 2008, 18:04:39 »
Igual ocuparas la misma cantidad de bytes... :mrgreen:
Esta bien lo que dice RICHI
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado jgpeiro06

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 276
Re: Como almacenar un dato tipo "float" en una variable de tipo "entero"
« Respuesta #3 en: 07 de Marzo de 2008, 19:02:21 »
Es cierto que puedo crear el array tipo float, pero eso me obligaria a convertir todos los long32 a float32 antes de almacenarlos.
La mayoria de los datos con los que trabajo son long32, y convertir estos a float me llevaria mas tiempo.
He estado buscando y en C++ existen un operador que se llama "reinterpret_cast", pero este operador no existe en C.
Tambien he conseguido algo jugando con los punteros:

        long stack[10];

        // aqui trabajamos con el stack como long32
   stack[1] = 4;
   stack[2] = 5;
   stack[0] = stack[1] + stack[2];  // 9
   
        //aqui tomamos el stack como float32
   stack[1] = 0x3FC00000;  //1.5
   stack[2] = 0x3FC00000;  //1.5
   float f = *((float*)&stack[1]) + *((float*)&stack[2]);
   stack[0] = *((long*)&f);  //3.0

Este codigo funciona con el MPLAB C30, pero no se si funciona xq se hace asi, o xq he mareado al compilador...supongo que debe haber una manera mas sencilla...

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Como almacenar un dato tipo "float" en una variable de tipo "entero"
« Respuesta #4 en: 07 de Marzo de 2008, 22:00:34 »
Cuando meto el valor_entero en el stack[] no hay problema, pero cuando introdzco el valor_float automaticamente lo convierte a long32 y al volver a leerlo como float vale 12.0

No se que hacer para evitar la conversion automatica. ¿conoceis alguna manera?¿quizas utilizando punteros?

jgpeiro06 no he usado el C30 pero sí el C18 y algún que otro compilador de C, tal vez te pueda echar una mano.

No entiendo cuando dices que si guardas un valor_float te lo convierte automáticamente en long32.  Eso porqué lo dices? lo ves en el WATCH y piensas que es así?

Una variable no puede cambiar su tipo una vez creada, creo que estás confundiendo las cosas, tal vez te mareas con el hecho de que la variable float ocupa 4 bytes y al verla en el watchlist como 'char' o long, la ves como 4 bytes pero te aseguro que de seguro es un dato float guardado contiguamente en la sección de pila que acabas de definir.

Si expones un ejemplo con valores de lo que ves, lo podemos analizar juntos.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado jgpeiro06

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 276
Re: Como almacenar un dato tipo "float" en una variable de tipo "entero"
« Respuesta #5 en: 08 de Marzo de 2008, 11:55:47 »
Estoy intentando hacer una JVM (maquina virtual de java) y para eso tengo que interpretar todas las instrucciones de java. Segun el picoJava-II™ Programmer’s
Reference Manual las instrucciones iadd y fadd realizan la siguiente accion:

iadd:
stack[2] = stack[2] + stack[1];

fadd:
float(stack[2]) = float(stack[1]) + float(stack[1]);

Donde float(value) significa:
Treat the 32-bit word, value, as a 32-bit single precision floating-point value.
Operations are treated as single-precision floating-point
operations if their operands are treated as floats.

Eso quiere decir que si hacemos un iadd el dato almacenado en es stack debe ser tratado como long32, que no es problema ya que el stack es declarado como long32 (Ej 0x7F800000 = 0x3FC00000 + 0x3FC00000). Con la instruccion fadd el dato es tratado como float (Ej 0x40400000 = 0x3FC00000 + 0x3FC00000 osea 3.0 = 1.5 + 1.5). 

Desconectado jgpeiro06

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 276
Re: Como almacenar un dato tipo "float" en una variable de tipo "entero"
« Respuesta #6 en: 08 de Marzo de 2008, 23:08:43 »
X cieerto ahora que lo pienso no se puede declarar el stack como float ya que se pierde precision. Si en un float de precision simple queremos almacenar un numero mayor que 2^23 perderemos precision. Ej long 16777216 al convertirlo a float se queda 1.677721*10^7 y al volverlo a pasar a long se queda 16777210. bueno, estos ejemplos no los he comprobado, pero creo que si que se pierde precision...

Desconectado jgpeiro06

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 276
Re: Como almacenar un dato tipo "float" en una variable de tipo "entero"
« Respuesta #7 en: 09 de Marzo de 2008, 08:39:08 »
bueno, esta es la solucion que he encontrado. Consiste marear con punteros como podeis ver a continuacion... lo he sacado de el codigo de un programa que se llama sablevm.
saludos

iadd //long32
ivalue1 = stack[2];
ivalue2 = stack[1];
stack[2] = ivalue1 + ivalue2;

ladd //longlong64
lvalue1 = *((long long *) (void *) &stack[4]);
lvalue2 = *((long long *) (void *) &stack[2]);
*((long long *) (void *) &stack[4]) = lvalue1 + lvalue2;

fadd //float32
fvalue1 = stack[2];
fvalue2 = stack[1];
*( (float *) (void *) &stack[2] ) = fvalue1 + fvalue2;

dadd //longdouble64
dvalue1 = *((double *) (void *) &stack[4]);
dvalue2 = *((double *) (void *) &stack[2]);
*((double *) (void *) &stack[OPTOP + 4]) = dvalue1 + dvalue2;

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
Re: Como almacenar un dato tipo "float" en una variable de tipo "entero"
« Respuesta #8 en: 09 de Marzo de 2008, 10:43:42 »
Hola jgpeiro

recuerdas esto??
Código: [Seleccionar]
http://homepages.cae.wisc.edu/~ece734/mmx/3D_geometry.html

Tenemos un punto con coordenadas X,Y,Z. y el ultimo dato siempre vale 1.



sourcef0[0]=30; //x
sourcef0[1]=30; //y
sourcef0[2]=0-30;//z
sourcef0[3]=0;//w=1

TR_RotateX(sourcef0,lx);
TR_RotateY(end,ly);


sourcef1[0][3]=end[0];
sourcef1[1][3]=end[1];
sourcef1[2][3]=end[2];
sourcef1[3][3]=end[3];


Ya ha llovido desde entonces!! cuanto tiempo sin saber de tí?? Como va tú vida? Por lo que veo sigues dándole al pedazo deporte ese de pensar ;) Aún recuerdo tu diseño de MP3 jejjeje... Conseguiste terminar el reconocimiento de caracteres 'pintando en el aire' ??


Un saludo y me alegra verte por aquí

Desconectado jgpeiro06

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 276
Re: Como almacenar un dato tipo "float" en una variable de tipo "entero"
« Respuesta #9 en: 11 de Marzo de 2008, 18:12:03 »
Hola J1M,
jejej, me sorprende que aun tengas ese codigo a mano...
Yo ahora estoy en la umh, cursando teleco Sist. Electronicos.
Lo de los reconocer movimientos si lo consegui, pero no movimientos mas simples como circulos, cruzes y mases (un total de 24 movimientos). Lo del MP3 lo deje hace tiempo, y el otro dia me alegre xq lei que lo habian conseguido portando las madlib.
Tu que tal con tus robots? x cierto, estas x aki x alicante? si quieres podemos qdar un dia

Desconectado J1M

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1960
Re: Como almacenar un dato tipo "float" en una variable de tipo "entero"
« Respuesta #10 en: 11 de Marzo de 2008, 20:59:12 »
Genial!! espero algún día subas un video del inventillo :) Me alegra que llegaras a la univ! se lo que te costó... aunque eso te sirviera para hacer las genialidades que has hecho :D

Respecto a los robots.... bueno... terminé o mejor dicho estoy a falta de entregar el PFC de Automática... pero mis pasos son algo diferentes, junto con dos compañeros más hemos montado una empresa y estamos a caballo entre los cursos de doctorado ( un sacabilletes :( ) y eso de empezar con una empresa desde 0 ....!!! la verdad no hay tiempo a veces ni para respirar... pero es genial ;)

No estoy en Alicante, sigo en CT ahora eso sí una cerveza queda pendiente eso seguro!

un saludo y espero que sigas con ese gusanillo interno por muuuucho tiempo!

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Como almacenar un dato tipo "float" en una variable de tipo "entero"
« Respuesta #11 en: 12 de Marzo de 2008, 08:48:25 »
bueno, esta es la solucion que he encontrado. Consiste marear con punteros como podeis ver a continuacion... lo he sacado de el codigo de un programa que se llama sablevm.
Ahora entiendo lo que querías hacer.  Si observas bien lo que habías definido antes, lo que resultó no es ni más ni menos que expresar en C lo que antes habías definido en lenguaje de fórmulas.

Lo de los punteros cuesta al principio captar la idea pero luego verás que no es tan complicado, se trata de 'castear' o tratar a un puntero a un tipo de dato como si fuera de otro tipo de dato.  el void como puntero se usa para usar un puntero "sin tipo" lo que permite precisamente hacer la asignación que haces.

saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)


 

anything