programa para lenguaje hacer ejemplos compilar compilador como codigo c gcc floating-point clang ieee-754

para - Estado de__STDC_IEC_559__ con compiladores C modernos



lenguaje c ejemplos (1)

  1. Creo que __STDC_IEC_559__ basa en algunas características de la biblioteca y no puede ser definido únicamente por el compilador. Vea esta publicación para alguna información. Esto no es infrecuente para C: el compilador y la biblioteca C a veces deben cooperar para implementar todo el estándar.

  2. Lo que pides depende del compilador. Creo que tendrías que tener un conocimiento especial del compilador para decidir esto. En el caso específico de GCC, define una macro para indicarle. Busque en este nodo del manual para __GCC_IEC_559 .

  3. Bueno ... no sé la respuesta a esta :-). La publicación original parece indicar que, sí, GCC podría definir __GCC_IEC_559 si pretende implementar IEEE 754, incluso si en realidad no lo hace.

C99 agregó una macro __STDC_IEC_559__ que puede usarse para probar si un compilador y una biblioteca estándar cumplen con el estándar ISO / IEC / IEEE 60559 (o IEEE 754).

Según las respuestas a esta pregunta.
how-to-check-that-ieee-754-single-precision-32-bit-floating-point-representation mayoría de los compiladores de C no __STDC_IEC_559__ macro del preprocesador __STDC_IEC_559__ .

De acuerdo con la documentación de GCC, no define __STDC_IEC_559__ .

Probé esto con GCC 4.9.2 y Clang 3.6.0, ambos usando con glibc 2.21 usando el siguiente código.

//test.c //#include <features.h> int main(void) { #if defined ( __STDC_IEC_559__ ) //#if defined ( __GCC_IEC_559__ ) return 1; #else return 0; #endif }

y entonces

echo $?

Esto muestra que con este código __STDC_IEC_559__ se define con GCC pero no con Clang. Luego hice gcc -E y se mostró que el archivo stdc-predef.h está incluido. Este archivo define __STDC_IEC_559__ .

/* glibc''s intent is to support the IEC 559 math functionality, real and complex. If the GCC (4.9 and later) predefined macros specifying compiler intent are available, use them to determine whether the overall intent is to support these features; otherwise, presume an older compiler has intent to support these features and define these macros by default. */ #ifdef __GCC_IEC_559 # if __GCC_IEC_559 > 0 # define __STDC_IEC_559__ 1 # endif #else # define __STDC_IEC_559__ 1 #endif

Esto confirma que es glibc que define esta macro y no GCC.

Sin embargo, cuando incluyo features.h (o stdio.h ) este archivo también está incluido en Clang y ese __STDC_IEC_559__ está definido.

Así que __STDC_IEC_559__ está definido por GCC y Clang (con un archivo de encabezado glibc ) que parece estar en desacuerdo con la respuesta a la primera pregunta a la que me vinculé.

Luego probé musl (por ejemplo, musl-gcc -test.c ) que es una biblioteca estándar diferente a glibc . Esto mostró que __STDC_IEC_559__ no está definido con musl .

Como lo entiendo, la biblioteca estándar de C no define el álgebra básica de punto flotante. Por ejemplo, la biblioteca estándar de C no define el resultado de 1.0/-0.0 . Esto es definido por el compilador.

Mis preguntas son (ordenadas en orden de importancia para mí):

  1. ¿Por qué __STDC_IEC_559__ está definido por glibc y no por el compilador?
  2. Si hiciera mi propia biblioteca estándar y quisiera definir __STDC_IEC_559__ necesitaría saber que el compilador ya cumple con IEEE 754 para operaciones no definidas en mi biblioteca estándar (por ejemplo, 1.0/-0.0 ). ¿Hay documentaciones para esto o una macro para probar esto?
  3. Wikipedia indica que "los usuarios deben saber que esta macro ( __STDC_IEC_559__ ) a veces se define mientras que no debería estar". ¿Es esta declaración todavía precisa?