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

printf("x == 1.1F?? %s", (x == 1.1F)? "SI":"NO");

En mi sistema (Codeblocks 12.11 con MinGW (Gcc 4.7.1) en Win XP SP3) esa comparación me da correcta.

Sobre visualizar valores flotantes en Hex con printf, te agradecería me indicases cuál es el especificador de formato necesario.

En cuanto a la constante, hacer sizeof(1.1F) a mí me da 4 (8 si pongo simplemente sizeof(1.1)).

Las constantes no "despromocionan". Cuando se utilizan en cálculos con coma flotante, se hace una copia y se promociona la copia según convenga, pero la constante (como su nombre indica) no se toca, es de sólo lectura. Lo que sí "despromociona" son las variables que hayan cambiado de valor como consecuencia de los cálculos, al volver a guardar su valor después de finalizar los cálculos.

El estándar C99 es una recomendación, no hay ley alguna que obligue a seguirlo. Simplemente, es una forma de facilitar el aprendizaje del lenguaje y no tener que aprender un montón de cosas nuevas cada vez que cambias de sistema y/o compilador. Lógicamente, los cambios que haya respecto de lo anterior no pueden implementarse todos de golpe de la noche a la mañana y procurando mantener compatibilidad con las versiones anteriores (lo que puede elevar sobremanera el trabajo necesario). Además, ningún programa está (en principio) libre de bugs.

Sobre la macro FLT_EVAL_METHOD, en efecto, mirando en <math.h> he encontrado esto (Linea 314 del archivo, en mi instalación):

Código C:
Ver original
  1. /* Use the compiler's builtin define for FLT_EVAL_METHOD to
  2.    set float_t and double_t.  */
  3. #if defined(__FLT_EVAL_METHOD__)  
  4. # if ( __FLT_EVAL_METHOD__== 0)
  5. typedef float float_t;
  6. typedef double double_t;
  7. # elif (__FLT_EVAL_METHOD__ == 1)
  8. typedef double float_t;
  9. typedef double double_t;
  10. # elif (__FLT_EVAL_METHOD__ == 2)
  11. typedef long double float_t;
  12. typedef long double double_t;
  13. #endif
  14. #else /* ix87 FPU default */
  15. typedef long double float_t;
  16. typedef long double double_t;
  17. #endif

es decir, que está ya construída así en el compilador y no sirve de nada cambiarla, como ya has comprobado.

De todos modos, cuando se trata de operaciones en coma flotante, hay que tener cuidado con las comparaciones de igualdad. Por ejemplo, echa un vistazo a un post del 28-03-2012 (Validacion doble, de Alvarito_gool).

Saludos,