# HG changeset patch # User Mike Miller # Date 1378657004 14400 # Node ID dbdff94bf9777ec588fadba4fd340dc7ce15538c # Parent e04847bbcfdfe6cf98301f06021b2310afded3eb Use std::numeric_limits for floating point bit widths * bitfcns.cc (max_mantissa_value): New utility function. (Fbitshift): Use max_mantissa_value, std::numeric_limits, and sizeof. (Fbitmax): Use max_mantissa_value. Cast output properly for class single. diff -r e04847bbcfdf -r dbdff94bf977 libinterp/corefcn/bitfcns.cc --- a/libinterp/corefcn/bitfcns.cc Sat Sep 07 12:21:38 2013 -0400 +++ b/libinterp/corefcn/bitfcns.cc Sun Sep 08 12:16:44 2013 -0400 @@ -344,6 +344,13 @@ return bitop ("bitxor", args); } +template +static int64_t +max_mantissa_value () +{ + return (static_cast (1) << std::numeric_limits::digits) - 1; +} + static int64_t bitshift (double a, int n, int64_t mask) { @@ -543,13 +550,14 @@ DO_SBITSHIFT (int64, nbits < 64 ? nbits : 64); else if (cname == "double") { - nbits = (nbits < 53 ? nbits : 53); - int64_t mask = 0x1FFFFFFFFFFFFFLL; - if (nbits < 53) - mask = mask >> (53 - nbits); + static const int bits_in_mantissa = std::numeric_limits::digits; + nbits = (nbits < bits_in_mantissa ? nbits : bits_in_mantissa); + int64_t mask = max_mantissa_value (); + if (nbits < bits_in_mantissa) + mask = mask >> (bits_in_mantissa - nbits); else if (nbits < 1) mask = 0; - int bits_in_type = 64; + int bits_in_type = sizeof (double) * CHAR_BIT; NDArray m = m_arg.array_value (); DO_BITSHIFT ( ); } @@ -592,9 +600,9 @@ } if (cname == "double") - retval = (static_cast (0x1FFFFFFFFFFFFFLL)); + retval = (static_cast (max_mantissa_value ())); else if (cname == "single") - retval = (static_cast (0xFFFFFFL)); + retval = (static_cast (max_mantissa_value ())); else error ("bitmax: not defined for class '%s'", cname.c_str ());