Estoy tratando de determinar en tiempo de compilación que _Float16 es compatible:
#define __STDC_WANT_IEC_60559_TYPES_EXT__ #include <float.h> #ifdef FLT16_MAX _Float16 f16; #endifInvocaciones:
# gcc trunk on linux on x86_64 $ gcc -std=c11 -pedantic -Wall -Wextra t0.c:4:1: warning: ISO C does not support the '_Float16' type [-Wpedantic] # clang trunk on linux on x86_64 $ clang -std=c11 -pedantic -Wall -Wextra t0.c:4:1: error: _Float16 is not supported on this targetAquí vemos que tanto gcc como clang:
FLT16_MAX_Float16 La pregunta principal: ¿Cómo determinar correctamente en el momento de la compilación que se admite _Float16 ?
La pregunta adicional: ¿El estándar C11 (o más reciente) requiere no definir macros _MIN / _MAX si el tipo flotante correspondiente no es compatible? Por ejemplo, para tipos enteros ( <stdint.h> ) es cierto: "ni definirá las macros asociadas" (C11, 7.20 Tipos enteros <stdint.h>, 4). ¿Es lo mismo para los tipos flotantes?
UPD20211117:
-pedantic hace que desaparezca la advertencia. Y _Float16 es compatible. ¡Estupendo!-pedantic no hace que el error desaparezca. Proabbly es un error.Gracias al usuario n. 1.8e9-dónde-está-mi-participación m. por la idea
UPD20211118: gcc: con -pedantic se define el FLT16_MAX , lo cual es inesperado (¿o no?).
¿Cómo determinar correctamente en tiempo de compilación que se admite _Float16?
Compile un programa que use _Float16 . Si compila, significa que es compatible.
El soporte de _FloatN se puede determinar comprobando si las macros MIN / MAX (y otras) asociadas están definidas (después de incluir float.h precedido por __STDC_WANT_IEC_60559_TYPES_EXT__ ).
Extra: el mismo principio se usa para determinar el soporte de tipos de stdint.h : verifique si las macros MIN / MAX asociadas están definidas.