Ver Mensaje Individual
  #4 (permalink)  
Antiguo 18/02/2013, 06:12
Fw190
 
Fecha de Ingreso: junio-2010
Ubicación: Madrid
Mensajes: 620
Antigüedad: 14 años, 6 meses
Puntos: 73
Respuesta: Números Subnormales en C (estándar C99 y GCC 4.7)

En efecto, lo más probable es que cambiar el valor de FLT_EVAL_METHOD no sirva de nada y solamente sea informativo de cara al programador. Para cambiar ese comportamiento se necesitaría reconstruir el compilador, y probablemente sea una reminiscencia de la época en que las FPU eran opcionales y había librerías que emulaban la FPU cuando no la había. De todos modos, cambiarlo para probar no sería dañino. Si es meramente informativo para el programador, cambiarlo es como el que tiene hambre y se rasca la cabeza. Si no lo es, para el compilador será una indicación de cómo tratar los números en coma flotante, y ya tendrá previstos los casos posibles.

Sobre imprimir el valor en hexadecimal de 1.1F me extraña, que yo sepa el especificador de formato de printf para imprimir en hexadecimal es válido solamente para tipos enteros. No sé si Gcc lo permite para otros tipos, el compilador que tengo disponible en este momento (Lcc-Win32) no lo permite. En cualquier caso, si lo permite y has hecho un cast a long double, es lógico que te muestre 12 bytes, ya que lo que tienes tras el cast es un long double.

Las constantes y variables no se almacenan en registros del procesador ni de la FPU, ni hay copias en RAM de 12 bytas para las de coma flotante. El funcionamiento es:

- Las variables y constantes float/double se guardan en memoria ocupando los 4/8 bytes que corresponden por su tipo.

- Caundo la FPU las necesita, las lee de la memoria y las promociona a long double. Este valor promocionado es el que se guarda en un registro de la FPU mientras se utiliza en los cálculos.

- Una vez finalizados los cálculos, el resultado se "despromociona" a su tipo anterior y se guarda en la memoria correspondiente.

En cuanto a fpclassify() no he podido hacer pruebas, la máquina donde tenía Gcc está fuera de servicio. Cuando pueda haré más pruebas y ya comentaré.

Saludos,