/*************************************************
Documentation of symbols defined by Math::GMPf
NV_IS_DOUBLE : Automatically defined by Makefile.PL iff
$Config{nvtype} is 'double'.
NV_IS_LONG_DOUBLE : Automatically defined by Makefile.PL iff
$Config{nvtype} is 'long double'.
NV_IS_FLOAT128 : Automatically defined by Makefile.PL iff
$Config{nvtype} is '__float128'
If NV_IS_FLOAT128 is defined we include the
quadmath.h header.
REQUIRED_LDBL_MANT_DIG : Defined to float.h's LDBL_MANT_DIG unless
LDBL_MANT_DIG is 106 (ie long double is
double-double) - in which case it is defined to
be 2098.
This is needed to ensure that the mpfr value is
an accurate rendition of the double-double value.
_WIN32_BIZARRE_INFNAN : Defined (on Windows only) when the perl version
(as expressed by $]) is less than 5.022.
These earlier perl versions generally stringified
NaNs as (-)1.#IND and Infs as (-)1.#INF.
*************************************************/
#include <stdio.h>
#if defined MATH_GMPF_NEED_LONG_LONG_INT
#ifndef _MSC_VER
#include <inttypes.h>
#endif
#endif
#include <stdlib.h>
#include <gmp.h>
#include<float.h>
#if defined(NV_IS_FLOAT128)
#include <quadmath.h>
#if defined(__MINGW32__) && !defined(__MINGW64__)
typedef __float128 float128 __attribute__ ((aligned(32)));
#elif defined(__MINGW64__) || (defined(DEBUGGING) && defined(NV_IS_DOUBLE))
typedef __float128 float128 __attribute__ ((aligned(8)));
#else
typedef __float128 float128;
#endif
#endif
#if LDBL_MANT_DIG == 106
#define REQUIRED_LDBL_MANT_DIG 2098
#else
#define REQUIRED_LDBL_MANT_DIG LDBL_MANT_DIG
#endif
#ifdef _MSC_VER
#pragma warning(disable:4700 4715 4716)
#endif
#if defined MATH_GMPF_NEED_LONG_LONG_INT
#ifndef _MSC_VER
#include <inttypes.h>
#endif
#endif
#define NEG_ZERO_BUG 50103 /* A bug affecting mpf_fits_u*_p functions */
/* Fixed in gmp after __GNU_MP_RELEASE 50103 ? */
#ifdef OLDPERL
#define SvUOK SvIsUV
#endif
#ifndef Newx
# define Newx(v,n,t) New(0,v,n,t)
#endif
#ifndef Newxz
# define Newxz(v,n,t) Newz(0,v,n,t)
#endif
#define NOK_POK_DUALVAR_CHECK \
if(SvNOK(b)) { \
nok_pok++; \
if(SvIV(get_sv("Math::GMPf::NOK_POK", 0))) \
warn("Scalar passed to %s is both NV and PV. Using PV (string) value"