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