/* LONG_DOUBLESIZE:
* This symbol contains the size of a long double, so that the
* C preprocessor can make decisions based on it. It is only
- * defined if the system supports long doubles.
+ * defined if the system supports long doubles. Note that this
+ * is sizeof(long double), which may include unused bytes.
*/
/* HAS_LDEXPL:
* This symbol, if defined, indicates that the ldexpl routine is
/* HAS_LLROUNDL:
* This symbol, if defined, indicates that the llroundl routine is
- * available to return the nearest long long value of the long double
- * argument value.
+ * available to return the nearest long long value away from zero of
+ * the long double argument value.
*/
#$d_llroundl HAS_LLROUNDL /**/
/* HAS_LRINTL:
* This symbol, if defined, indicates that the lrintl routine is
- * available to return the closest integral value to the long double
+ * available to return the closest integral value of the long double
* argument according to the current rounding mode.
*/
#$d_lrintl HAS_LRINTL /**/
/* HAS_LROUNDL:
* This symbol, if defined, indicates that the lroundl routine is
- * available to return the nearest integral value to the long double
- * argument.
+ * available to return the nearest integral value away from zero of
+ * the long double argument value.
*/
#$d_lroundl HAS_LROUNDL /**/
*/
#$i_ustat I_USTAT /**/
+/* DOUBLEINFBYTES:
+ * This symbol, if defined, is a comma-separated list of
+ * hexadecimal bytes for the double precision infinity.
+ */
+/* DOUBLENANBYTES:
+ * This symbol, if defined, is a comma-separated list of
+ * hexadecimal bytes (0xHH) for the double precision not-a-number.
+ */
+/* LONGDBLINFBYTES:
+ * This symbol, if defined, is a comma-separated list of
+ * hexadecimal bytes for the long double precision infinity.
+ */
+/* LONGDBLNANBYTES:
+ * This symbol, if defined, is a comma-separated list of
+ * hexadecimal bytes (0xHH) for the long double precision not-a-number.
+ */
+#define DOUBLEINFBYTES $doubleinfbytes /**/
+#define DOUBLENANBYTES $doublenanbytes /**/
+#define LONGDBLINFBYTES $longdblinfbytes /**/
+#define LONGDBLNANBYTES $longdblnanbytes /**/
+
/* PERL_PRIfldbl:
* This symbol, if defined, contains the string used by stdio to
* format long doubles (format 'f') for output.
#$d_PRIeldbl PERL_PRIeldbl $sPRIeldbl /**/
#$d_SCNfldbl PERL_SCNfldbl $sSCNfldbl /**/
+/* DOUBLEMANTBITS:
+ * This symbol, if defined, tells how many mantissa bits
+ * there are in double precision floating point format.
+ * Note that this is usually DBL_MANT_DIG minus one, since
+ * with the standard IEEE 754 formats DBL_MANT_DIG includes
+ * the implicit bit, which doesn't really exist.
+ */
+/* LONGDBLMANTBITS:
+ * This symbol, if defined, tells how many mantissa bits
+ * there are in long double precision floating point format.
+ * Note that this can be LDBL_MANT_DIG minus one,
+ * since LDBL_MANT_DIG can include the IEEE 754 implicit bit.
+ * The common x86-style 80-bit long double does not have
+ * an implicit bit.
+ */
+/* NVMANTBITS:
+ * This symbol, if defined, tells how many mantissa bits
+ * (not including implicit bit) there are in a Perl NV.
+ * This depends on which floating point type was chosen.
+ */
+#define DOUBLEMANTBITS $doublemantbits
+#define LONGDBLMANTBITS $longdblmantbits
+#define NVMANTBITS $nvmantbits
+
/* NEED_VA_COPY:
* This symbol, if defined, indicates that the system stores
* the variable argument list datatype, va_list, in a format
*/
/* NVSIZE:
* This symbol contains the sizeof(NV).
+ * Note that some floating point formats have unused bytes.
+ * The most notable example is the x86* 80-bit extended precision
+ * which comes in byte sizes of 12 and 16 (for 32 and 64 bit
+ * platforms, respectively), but which only uses 10 bytes.
+ * Perl compiled with -Duselongdouble on x86* is like this.
*/
/* NV_PRESERVES_UV:
* This symbol, if defined, indicates that a variable of type NVTYPE