This is an automated email from the ASF dual-hosted git repository. xiaoxiang781216 pushed a commit to branch releases/13.0 in repository https://gitbox.apache.org/repos/asf/nuttx.git
commit 2d8b9deb6b70ebdcbcfa89e3455ccd028815c64e Author: Karel Kočí <[email protected]> AuthorDate: Mon Jun 29 16:27:02 2026 +0200 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čí <[email protected]> --- include/nuttx/compiler.h | 10 ++++++ include/nuttx/lib/float.h | 84 +++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 84 insertions(+), 10 deletions(-) diff --git a/include/nuttx/compiler.h b/include/nuttx/compiler.h index 81d83f501a8..fbf04775dbe 100644 --- a/include/nuttx/compiler.h +++ b/include/nuttx/compiler.h @@ -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__) diff --git a/include/nuttx/lib/float.h b/include/nuttx/lib/float.h index d130022d9c0..8c7d74428a5 100644 --- a/include/nuttx/lib/float.h +++ b/include/nuttx/lib/float.h @@ -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
