From 09b94b1f0efd8c107548a6fefcd471e9b06c2cdf Mon Sep 17 00:00:00 2001 From: Sisyphus Date: Thu, 20 Aug 2015 07:28:33 -0400 Subject: [PATCH] [perl #125669] op/pack.t failures with PPC long double (double double) builds unpack '%65...' failures, to be more exact. --- pp_pack.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/pp_pack.c b/pp_pack.c index b1a0d85..8d7f1e2 100644 --- a/pp_pack.c +++ b/pp_pack.c @@ -1767,7 +1767,18 @@ S_unpack_rec(pTHX_ tempsym_t* symptr, const char *s, const char *strbeg, const c } while (cdouble < 0.0) cdouble += anv; - cdouble = Perl_modf(cdouble / anv, &trouble) * anv; + cdouble = Perl_modf(cdouble / anv, &trouble); +#ifdef LONGDOUBLE_DOUBLEDOUBLE + /* Workaround for powerpc doubledouble modfl bug: + * close to 1.0L and -1.0L cdouble is 0, and trouble + * is cdouble / anv. */ + if (trouble != Perl_ceil(trouble)) { + cdouble = trouble; + if (cdouble > 1.0L) cdouble -= 1.0L; + if (cdouble < -1.0L) cdouble += 1.0L; + } +#endif + cdouble *= anv; sv = newSVnv(cdouble); } else { -- 1.8.3.1