@@ -265,6 +265,16 @@ typedef union { double d; ULong L[2]; } U;
265265#define Big0 (Frac_mask1 | Exp_msk1*(DBL_MAX_EXP+Bias-1))
266266#define Big1 0xffffffff
267267
268+ /* Standard NaN used by _Py_dg_stdnan. */
269+
270+ #define NAN_WORD0 0x7ff80000
271+ #define NAN_WORD1 0
272+
273+ /* Bits of the representation of positive infinity. */
274+
275+ #define POSINF_WORD0 0x7ff00000
276+ #define POSINF_WORD1 0
277+
268278/* struct BCinfo is used to pass information from _Py_dg_strtod to bigcomp */
269279
270280typedef struct BCinfo BCinfo ;
@@ -1486,6 +1496,36 @@ bigcomp(U *rv, const char *s0, BCinfo *bc)
14861496 return 0 ;
14871497}
14881498
1499+ /* Return a 'standard' NaN value.
1500+
1501+ There are exactly two quiet NaNs that don't arise by 'quieting' signaling
1502+ NaNs (see IEEE 754-2008, section 6.2.1). If sign == 0, return the one whose
1503+ sign bit is cleared. Otherwise, return the one whose sign bit is set.
1504+ */
1505+
1506+ double
1507+ _Py_dg_stdnan (int sign )
1508+ {
1509+ U rv ;
1510+ word0 (& rv ) = NAN_WORD0 ;
1511+ word1 (& rv ) = NAN_WORD1 ;
1512+ if (sign )
1513+ word0 (& rv ) |= Sign_bit ;
1514+ return dval (& rv );
1515+ }
1516+
1517+ /* Return positive or negative infinity, according to the given sign (0 for
1518+ * positive infinity, 1 for negative infinity). */
1519+
1520+ double
1521+ _Py_dg_infinity (int sign )
1522+ {
1523+ U rv ;
1524+ word0 (& rv ) = POSINF_WORD0 ;
1525+ word1 (& rv ) = POSINF_WORD1 ;
1526+ return sign ? - dval (& rv ) : dval (& rv );
1527+ }
1528+
14891529double
14901530_Py_dg_strtod (const char * s00 , char * * se )
14911531{
@@ -1886,20 +1926,20 @@ _Py_dg_strtod(const char *s00, char **se)
18861926 bd2 ++ ;
18871927
18881928 /* At this stage bd5 - bb5 == e == bd2 - bb2 + bbe, bb2 - bs2 == 1,
1889- and bs == 1, so:
1929+ and bs == 1, so:
18901930
18911931 tdv == bd * 10**e = bd * 2**(bbe - bb2 + bd2) * 5**(bd5 - bb5)
18921932 srv == bb * 2**bbe = bb * 2**(bbe - bb2 + bb2)
1893- 0.5 ulp(srv) == 2**(bbe-1) = bs * 2**(bbe - bb2 + bs2)
1933+ 0.5 ulp(srv) == 2**(bbe-1) = bs * 2**(bbe - bb2 + bs2)
18941934
1895- It follows that:
1935+ It follows that:
18961936
18971937 M * tdv = bd * 2**bd2 * 5**bd5
18981938 M * srv = bb * 2**bb2 * 5**bb5
18991939 M * 0.5 ulp(srv) = bs * 2**bs2 * 5**bb5
19001940
1901- for some constant M. (Actually, M == 2**(bb2 - bbe) * 5**bb5, but
1902- this fact is not needed below.)
1941+ for some constant M. (Actually, M == 2**(bb2 - bbe) * 5**bb5, but
1942+ this fact is not needed below.)
19031943 */
19041944
19051945 /* Remove factor of 2**i, where i = min(bb2, bd2, bs2). */
0 commit comments