float.h: improve long double related definitions

This addresses "FIX ME" definitions for the long double. These might not
be all long double format supported by NuttX.

The support was also added only for GCC alike compilers. Other compilers
that have CONFIG_HAVE_LONG_DOUBLE defined will fail with error that
mantisage digits have to be defined for that compiler.

Signed-off-by: Karel Kočí <kkoci@elektroline.cz>
This commit is contained in:
Karel Kočí 2026-06-29 16:27:02 +02:00 committed by Alan C. Assis
parent a3029acf95
commit 63dcb8163b
2 changed files with 84 additions and 10 deletions

View file

@ -621,6 +621,12 @@
# endif
/* Use compiler definition to define long double mantisa digits */
# ifdef CONFIG_HAVE_LONG_DOUBLE
# define LDBL_MANT_DIG __LDBL_MANT_DIG__
# endif
/* Indicate that a local variable is not used */
# ifndef UNUSED
@ -1201,6 +1207,10 @@
# define memory_barrier()
/* long double is suppose to be same as double on MSVC. */
# define LDBL_MANT_DIG 53
/* TASKING (Infineon AURIX C/C++)-specific definitions **********************/
#elif defined(__TASKING__)

View file

@ -64,7 +64,7 @@
#ifndef LDBL_MANT_DIG /* May be defined in a toolchain header */
# ifdef CONFIG_HAVE_LONG_DOUBLE
# define LDBL_MANT_DIG DBL_MANT_DIG /* FIX ME */
# error "LDBL_MANT_DIG has to be defined in compiler.h"
# else
# define LDBL_MANT_DIG DBL_MANT_DIG
# endif
@ -96,8 +96,16 @@
#endif
#ifndef LDBL_DIG /* May be defined in a toolchain header */
# ifdef CONFIG_HAVE_LONG_DOUBLE
# define LDBL_DIG DBL_DIG /* FIX ME */
# ifdef CONFIG_HAVE_LONG_DOUBLE
# if LDBL_MANT_DIG == 53 /* IEEE binary64 */
# define LDBL_DIG DBL_DIG
# elif LDBL_MANT_DIG == 64 /* x87 80-bit */
# define LDBL_DIG 18
# elif LDBL_MANT_DIG == 113 /* IEEE binary128 */
# define LDBL_DIG 33
# else
# error "Unknown long double format"
# endif
# else
# define LDBL_DIG DBL_DIG
# endif
@ -121,7 +129,15 @@
#ifndef LDBL_MIN_EXP /* May be defined in a toolchain header */
# ifdef CONFIG_HAVE_LONG_DOUBLE
# define LDBL_MIN_EXP DBL_MIN_EXP /* FIX ME */
# if LDBL_MANT_DIG == 53 /* IEEE binary64 */
# define LDBL_MIN_EXP DBL_MIN_EXP
# elif LDBL_MANT_DIG == 64 /* x87 80-bit */
# define LDBL_MIN_EXP (-16381)
# elif LDBL_MANT_DIG == 113 /* IEEE binary128 */
# define LDBL_MIN_EXP (-16381)
# else
# error "Unknown long double format"
# endif
# else
# define LDBL_MIN_EXP DBL_MIN_EXP
# endif
@ -145,7 +161,15 @@
#ifndef LDBL_MIN_10_EXP /* May be defined in a toolchain header */
# ifdef CONFIG_HAVE_LONG_DOUBLE
# define LDBL_MIN_10_EXP DBL_MIN_10_EXP /* FIX ME */
# if LDBL_MANT_DIG == 53 /* IEEE binary64 */
# define LDBL_MIN_10_EXP DBL_MIN_10_EXP
# elif LDBL_MANT_DIG == 64 /* x87 80-bit */
# define LDBL_MIN_10_EXP (-4931)
# elif LDBL_MANT_DIG == 113 /* IEEE binary128 */
# define LDBL_MIN_10_EXP (-4931)
# else
# error "Unknown long double format"
# endif
# else
# define LDBL_MIN_10_EXP DBL_MIN_10_EXP
# endif
@ -169,7 +193,15 @@
#ifndef LDBL_MAX_EXP /* May be defined in a toolchain header */
# ifdef CONFIG_HAVE_LONG_DOUBLE
# define LDBL_MAX_EXP DBL_MAX_EXP /* FIX ME */
# if LDBL_MANT_DIG == 53 /* IEEE binary64 */
# define LDBL_MAX_EXP DBL_MAX_EXP
# elif LDBL_MANT_DIG == 64 /* x87 80-bit */
# define LDBL_MAX_EXP 16384
# elif LDBL_MANT_DIG == 113 /* IEEE binary128 */
# define LDBL_MAX_EXP 16384
# else
# error "Unknown long double format"
# endif
# else
# define LDBL_MAX_EXP DBL_MAX_EXP
# endif
@ -193,7 +225,15 @@
#ifndef LDBL_MAX_10_EXP /* May be defined in toolchain header */
# ifdef CONFIG_HAVE_LONG_DOUBLE
# define LDBL_MAX_10_EXP DBL_MAX_10_EXP /* FIX ME */
# if LDBL_MANT_DIG == 53 /* IEEE binary64 */
# define LDBL_MAX_10_EXP DBL_MAX_10_EXP
# elif LDBL_MANT_DIG == 64 /* x87 80-bit */
# define LDBL_MAX_10_EXP 4932
# elif LDBL_MANT_DIG == 113 /* IEEE binary128 */
# define LDBL_MAX_10_EXP 4932
# else
# error "Unknown long double format"
# endif
# else
# define LDBL_MAX_10_EXP DBL_MAX_10_EXP
# endif
@ -215,7 +255,15 @@
#ifndef LDBL_MAX /* May be defined in toolchain header */
# ifdef CONFIG_HAVE_LONG_DOUBLE
# define LDBL_MAX DBL_MAX /* FIX ME */
# if LDBL_MANT_DIG == 53 /* IEEE binary64 */
# define LDBL_MAX DBL_MAX
# elif LDBL_MANT_DIG == 64 /* x87 80-bit */
# define LDBL_MAX 1.18973149535723176502126385303097021e+4932L
# elif LDBL_MANT_DIG == 113 /* IEEE binary128 */
# define LDBL_MAX 1.18973149535723176508575932662800702e+4932L
# else
# error "Unknown long double format"
# endif
# else
# define LDBL_MAX DBL_MAX
# endif
@ -239,7 +287,15 @@
#ifndef LDBL_EPSILON /* May be defined in toolchain header */
# ifdef CONFIG_HAVE_LONG_DOUBLE
# define LDBL_EPSILON DBL_EPSILON /* FIX ME */
# if LDBL_MANT_DIG == 53 /* IEEE binary64 */
# define LDBL_EPSILON DBL_EPSILON
# elif LDBL_MANT_DIG == 64 /* x87 80-bit */
# define LDBL_EPSILON 1.08420217248550443400745280086994171e-19L
# elif LDBL_MANT_DIG == 113 /* IEEE binary128 */
# define LDBL_EPSILON 1.92592994438723585305597794258492732e-34L
# else
# error "Unknown long double format"
# endif
# else
# define LDBL_EPSILON DBL_EPSILON
# endif
@ -261,7 +317,15 @@
#ifndef LDBL_MIN /* May be defined in toolchain header */
# ifdef CONFIG_HAVE_LONG_DOUBLE
# define LDBL_MIN DBL_MIN /* FIX ME */
# if LDBL_MANT_DIG == 53 /* IEEE binary64 */
# define LDBL_MIN DBL_MIN
# elif LDBL_MANT_DIG == 64 /* x87 80-bit */
# define LDBL_MIN 3.36210314311209350626267781732175260e-4932L
# elif LDBL_MANT_DIG == 113 /* IEEE binary128 */
# define LDBL_MIN 3.36210314311209350626267781732175260e-4932L
# else
# error "Unknown long double format"
# endif
# else
# define LDBL_MIN DBL_MIN
# endif