MicroDouble.java
上传用户:hygd004
上传日期:2022-07-01
资源大小:246k
文件大小:135k
源码类别:

J2ME

开发平台:

Java

  1. // $Id: MicroDouble.java,v 1.2 2004/08/03 04:57:42 Dave Exp $
  2. /*
  3.  * Double.java
  4.  * Copyright (C) 2003, 2004 David Clausen
  5.  *
  6.  * This program is free software; you can redistribute it and/or
  7.  * modify it under the terms of the GNU General Public License
  8.  * as published by the Free Software Foundation; either version 2
  9.  * of the License, or (at your option) any later version.
  10.  *
  11.  * This program is distributed in the hope that it will be useful,
  12.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  * GNU General Public License for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program; if not, write to the Free Software
  18.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  19.  *
  20.  * Portions of this software are derived from FDLIBM, which contained the
  21.  * following notice:
  22.  *
  23.  * ====================================================
  24.  * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
  25.  *
  26.  * Developed at SunSoft, a Sun Microsystems, Inc. business.
  27.  * Permission to use, copy, modify, and distribute this
  28.  * software is freely granted, provided that this notice 
  29.  * is preserved.
  30.  * ====================================================
  31.  *
  32.  * For mor information on FDLIBM see:
  33.  * http://netlib.bell-labs.com/netlib/fdlibm/index.html
  34.  *
  35.  */
  36. package net.dclausen.microfloat;
  37. import java.util.Random;
  38. /**
  39.  * A software implementation of IEEE-754 double precision math which does not
  40.  * rely on the <code>double</code> data type. 
  41.  * This class overloads the <code>long</code> data type by storing 
  42.  * <code>double</code> data in it.
  43.  * See the 
  44.  * <a href="package-summary.html#package_description">package description</a> 
  45.  * for more information.
  46.  * <p>
  47.  * @author David Clausen
  48.  * @see <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Double.html">Double</a>
  49.  * @see <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html">Math</a>
  50.  * @see Float
  51.  * @version $Revision: 1.2 $
  52.  */
  53. public class MicroDouble {
  54.   
  55.   /////////////////////////////////////////////////////////////////////////////
  56.   // General-purpose constants
  57.   /////////////////////////////////////////////////////////////////////////////
  58.   /**
  59.    * A constant holding the same value as <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Double.html#POSITIVE_INFINITY">Double.POSITIVE_INFINITY</a>
  60.    */
  61.   public  static final long POSITIVE_INFINITY = 0x7ff0000000000000L;
  62.   
  63.   /**
  64.    * A constant holding the same value as <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Double.html#NEGATIVE_INFINITY">Double.NEGATIVE_INFINITY</a>
  65.    */
  66.   public  static final long NEGATIVE_INFINITY = 0xfff0000000000000L;
  67.   /**
  68.    * A constant holding the same value as <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Double.html#NaN">Double.NaN</a>
  69.    */
  70.   public  static final long NaN               = 0x7ff8000000000000L;
  71.   
  72.   /**
  73.    * A constant holding the same value as <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Double.html#MAX_VALUE">Double.MAX_VALUE</a>
  74.    */
  75.   public  static final long MAX_VALUE         = 0x7fefffffffffffffL;
  76.   
  77.   /**
  78.    * A constant holding the same value as <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Double.html#MIN_VALUE">Double.MIN_VALUE</a>
  79.    */
  80.   public  static final long MIN_VALUE         = 0x0000000000000001L; 
  81.   
  82.   /**
  83.    * A constant holding the same value as <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html#E">Math.E</a>
  84.    */
  85.   public  static final long E                 = 0x4005bf0a8b145769L;
  86.   
  87.   /**
  88.    * A constant holding the same value as <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html#PI">Math.PI</a>
  89.    */
  90.   public  static final long PI                = 0x400921fb54442d18L;
  91.   // Other constants needed internally, and exposed as a convenience.
  92.   /** A constant holding the value of 0.0d */
  93.   public static final long ZERO              = 0x0000000000000000L;
  94.   /** A constant holding the value of -0.0d */
  95.   public static final long NEGATIVE_ZERO     = 0x8000000000000000L;
  96.   
  97.   /** A constant holding the value of 1.0d */
  98.   public static final long ONE               = 0x3ff0000000000000L;
  99.   
  100.   /** A constant holding the value of -1.0d */
  101.   public static final long NEGATIVE_ONE      = 0xbff0000000000000L;
  102.   
  103.   /** A constant holding the value of 2.0d */
  104.   public static final long TWO               = 0x4000000000000000L;
  105.   
  106.   /** A constant holding the value of 3.0d */
  107.   public static final long THREE             = 0x4008000000000000L;
  108.   
  109.   /** A constant holding the value of 4.0d */
  110.   public static final long FOUR              = 0x4010000000000000L;
  111.   
  112.   /** A constant holding the value of 5.0d */
  113.   public static final long FIVE              = 0x4014000000000000L;
  114.   
  115.   /** A constant holding the value of 6.0d */
  116.   public static final long SIX               = 0x4018000000000000L;
  117.   
  118.   /** A constant holding the value of 8.0d */
  119.   public static final long EIGHT             = 0x4020000000000000L;
  120.   
  121.   /** A constant holding the value of 10.0d */
  122.   public static final long TEN               = 0x4024000000000000L;
  123.   
  124.   /** A constant holding the value of 100.0d */
  125.   public static final long ONE_HUNDRED       = 0x4059000000000000L;
  126.   
  127.   /** A constant holding the value of 1.5d */
  128.   public static final long THREE_HALVES      = 0x3ff8000000000000L;
  129.   
  130.   /** A constant holding the value of 0.5d */
  131.   public static final long ONE_HALF          = 0x3fe0000000000000L;
  132.   
  133.   /** A constant holding the value of (1.0d / 3.0d) */
  134.   public static final long ONE_THIRD         = 0x3fd5555555555555L;
  135.   
  136.   /** A constant holding the value of 0.25d */
  137.   public static final long ONE_FOURTH        = 0x3fd0000000000000L;
  138.   
  139.   /** A constant holding the value of 0.125d */
  140.   public static final long ONE_EIGHTH        = 0x3fc0000000000000L;
  141.   
  142.   /** A constant holding the natural logarithm of 2 */
  143.   public static final long LN2               = 0x3fe62e42fefa39efL;
  144.   
  145.   /////////////////////////////////////////////////////////////////////////////
  146.   // Packing and unpacking the IEEE-754 double precision format
  147.   /////////////////////////////////////////////////////////////////////////////
  148.   private static final long ABS_MASK          = 0x7fffffffffffffffL;
  149.   private static final long SIGN_MASK         = 0x8000000000000000L; // 1 bit
  150.   private static final long EXPONENT_MASK     = 0x7ff0000000000000L; // 11 bits
  151.   private static final long FRACTION_MASK     = 0x000fffffffffffffL; // 52 bits
  152.   private static final long IMPLIED_ONE       = 0x0010000000000000L; // 53rd bit
  153.   /** @return true iff d is negative */
  154.   static boolean unpackSign(long d) {
  155.     return (d < 0L);
  156.   }
  157.   /** @return an integer in the range [-1075, 972] */
  158.   static int unpackExponent(long d) {
  159.     return (((int) (d >> 52)) & 0x7ff) - 1075;
  160.   }
  161.   /** @return a long in the range [0, 0x001fffffffffffffL] */
  162.   static long unpackMantissa(long d) {
  163.     if ((d & EXPONENT_MASK) == 0) {
  164.       return ((d & FRACTION_MASK) << 1);
  165.     } else {
  166.       return ((d & FRACTION_MASK) | IMPLIED_ONE);
  167.     }
  168.   }
  169.   /** 
  170.    * @return the double which most closely represents the given base-2 mantissa
  171.    *         and exponent
  172.    */
  173.   static long pack(boolean negative, int exponent, long mantissa) {
  174.     // reduce precision of mantissa, rounding if necessary
  175.     if (mantissa != 0) {
  176.       // left align mantissa
  177.       int shift = BitUtils.countLeadingZeros(mantissa);
  178.       mantissa <<= shift;
  179.       exponent -= shift;
  180.       if (exponent < -1085) {
  181.         // subnormal
  182.         mantissa = BitUtils.roundingRightShift(mantissa, -1074 - exponent);
  183.       } else {
  184.         // normal
  185.         mantissa = BitUtils.roundingRightShift(mantissa, 11);
  186.         if (mantissa == 0x20000000000000L) {
  187.           // oops, rounding carried into the 54th bit
  188.           mantissa = 0x10000000000000L;
  189.           exponent++;
  190.         }
  191.         // pack the exponent
  192.         if (exponent > 960) {
  193.           mantissa = POSITIVE_INFINITY;
  194.         } else {
  195.           mantissa ^= IMPLIED_ONE;
  196.           mantissa |= ((long) (exponent + 1086)) << 52;
  197.         }
  198.       }
  199.     }
  200.     
  201.     // pack the sign bit
  202.     if (negative) {
  203.       mantissa |= SIGN_MASK;
  204.     }
  205.     
  206.     return mantissa;
  207.   }
  208.   
  209.   /////////////////////////////////////////////////////////////////////////////
  210.   // Simple tests 
  211.   /////////////////////////////////////////////////////////////////////////////
  212.   /**
  213.    * Mimics <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Double.html#isNaN(double)">Double.isNaN(double)</a>
  214.    */
  215.   public static boolean isNaN(long d) {
  216.     return ((d & ABS_MASK) > POSITIVE_INFINITY);
  217.   }
  218.   /**
  219.    * Mimics <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Double.html#isInfinite(double)">Double.isInfinite(double)</a>
  220.    */
  221.   public static boolean isInfinite(long d) {
  222.     return ((d & ABS_MASK) == POSITIVE_INFINITY);
  223.   }
  224.   
  225.   /**
  226.    * Returns <code>true</code> if the specified number has zero
  227.    * magnitude, <code>false</code> otherwise.
  228.    *
  229.    * @param   d   the <code>double</code> value to be tested.
  230.    * @return  <code>true</code> if the value of the argument is positive
  231.    *          zero or negative zero; <code>false</code> otherwise.
  232.    */
  233.   public static boolean isZero(long d) {
  234.     return ((d & ABS_MASK) == ZERO);
  235.   }
  236.   
  237.   /////////////////////////////////////////////////////////////////////////////
  238.   // Sign changes
  239.   /////////////////////////////////////////////////////////////////////////////
  240.   /**
  241.    * Mimics <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html#abs(double)">Math.abs(double)</a>
  242.    */
  243.   public static long abs(long d) {
  244.     //if (isNaN(d)) {
  245.     //  return NaN;
  246.     //}
  247.     return (d & ABS_MASK);
  248.   }
  249.   /**
  250.    * Returns the negation of a <code>double</code> value.
  251.    * Special cases:
  252.    * <ul>
  253.    * <li>If the argument is negative zero, the result is positive zero.
  254.    * <li>If the argument is positive zero, the result is negative zero.
  255.    * <li>If the argument is negative infinity, the result is positive infinity.
  256.    * <li>If the argument is positive infinity, the result is negative infinity.
  257.    * <li>If the argument is NaN, the result is NaN.</ul>
  258.    * <p>
  259.    * This method takes the place of the unary <code>-</code> operator.
  260.    *
  261.    * @param   d   the <code>double</code> value whose negated value is to be 
  262.    *              determined
  263.    * @return  the negation of the argument.
  264.    */
  265.   public static long negate(long d) {
  266.     if (isNaN(d)) {
  267.       return NaN;
  268.     }
  269.     return (d ^ SIGN_MASK);
  270.   }
  271.   
  272.   /////////////////////////////////////////////////////////////////////////////
  273.   // Comparison
  274.   /////////////////////////////////////////////////////////////////////////////
  275.   /**
  276.    * Returns <code>true</code> if the specified numbers are considered equal
  277.    * according to 
  278.    * <a href="http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5198">section 15.21.1
  279.    * of the JLS</a>.  Special cases:
  280.    * <ul>
  281.    * <li>If either operand is NaN, then the result is false
  282.    * <li>Positive zero and negative zero are considered equal
  283.    * </ul>
  284.    * <p>
  285.    * This method takes the place of the <code>==</code> operator.
  286.    *
  287.    * @param   d1   the first <code>double</code> value to be compared.
  288.    * @param   d2   the second <code>double</code> value to be compared.
  289.    * @return  <code>true</code> if the two values are considered equal;
  290.    *          <code>false</code> otherwise.
  291.    */
  292.   public static boolean eq(long d1, long d2) {
  293.     return (((d1 == d2) && (! isNaN(d1))) || (isZero(d1) && isZero(d2)));
  294.   }
  295.   /**
  296.    * Returns <code>true</code> if the specified numbers are considered unequal
  297.    * according to 
  298.    * <a href="http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5198">section
  299.    * 15.21.1 of the JLS</a>.  Special cases:
  300.    * <ul>
  301.    * <li>If either operand is NaN, then the result is true
  302.    * <li>Positive zero and negative zero are considered equal
  303.    * </ul>
  304.    * The value returned by <code>ne</code> is always the opposite of the value
  305.    * returned by <code>eq</code> for the same arguments.
  306.    * <p>
  307.    * This method takes the place of the <code>!=</code> operator.
  308.    *
  309.    * @param   d1   the first <code>double</code> value to be compared.
  310.    * @param   d2   the second <code>double</code> value to be compared.
  311.    * @return  <code>true</code> if the two values are considered equal;
  312.    *          <code>false</code> otherwise.
  313.    */
  314.   public static boolean ne(long d1, long d2) {
  315.     return (! eq(d1, d2));
  316.   }
  317.   /**
  318.    * Returns <code>true</code> if the first argument is considered less than
  319.    * the second argument according to 
  320.    * <a href="http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#153654">section
  321.    * 15.20.1 of the JLS</a>.  Special cases:
  322.    * <ul>
  323.    * <li>If either operand is NaN, then the result is false
  324.    * <li>Positive zero and negative zero are considered equal
  325.    * <li>Negative infinity is conisdered less than all other values except NaN
  326.    * <li>Positive infinity is conisdered greater than all other values except NaN
  327.    * </ul>
  328.    * <p>
  329.    * This method takes the place of the <code>&lt;</code> operator.
  330.    *
  331.    * @param   d1   the first <code>double</code> value to be compared.
  332.    * @param   d2   the second <code>double</code> value to be compared.
  333.    * @return  <code>true</code> if the first value is less than the second value;
  334.    *          <code>false</code> otherwise.
  335.    */
  336.   public static boolean lt(long d1, long d2) {
  337.     if (isNaN(d1) || isNaN(d2)) {
  338.       return false;
  339.     } else if (d2 == ZERO) {
  340.       d2 = NEGATIVE_ZERO;
  341.     }
  342.     return (cmp(d1, d2) < 0);
  343.   }
  344.   
  345.   /**
  346.    * Returns <code>true</code> if the first argument is considered less than
  347.    * or equal to the second argument according to 
  348.    * <a href="http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#153654">section
  349.    * 15.20.1 of the JLS</a>.  Special cases:
  350.    * <ul>
  351.    * <li>If either operand is NaN, then the result is false
  352.    * <li>Positive zero and negative zero are considered equal
  353.    * <li>Negative infinity is conisdered less than all other values except NaN
  354.    * <li>Positive infinity is conisdered greater than all other values except NaN
  355.    * </ul>
  356.    * <p>
  357.    * This method takes the place of the <code>&lt;=</code> operator.
  358.    *
  359.    * @param   d1   the first <code>double</code> value to be compared.
  360.    * @param   d2   the second <code>double</code> value to be compared.
  361.    * @return  <code>true</code> if the first value is less than or equal to 
  362.    *          the second value; <code>false</code> otherwise.
  363.    */
  364.   public static boolean le(long d1, long d2) {
  365.     if (isNaN(d1) || isNaN(d2)) {
  366.       return false;
  367.     } else if (d2 == NEGATIVE_ZERO) {
  368.       d2 = ZERO;
  369.     }
  370.     return (cmp(d1, d2) <= 0);
  371.   }
  372.   /**
  373.    * Returns <code>true</code> if the first argument is considered greater than
  374.    * the second argument according to 
  375.    * <a href="http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#153654">section
  376.    * 15.20.1 of the JLS</a>.  Special cases:
  377.    * <ul>
  378.    * <li>If either operand is NaN, then the result is false
  379.    * <li>Positive zero and negative zero are considered equal
  380.    * <li>Negative infinity is conisdered less than all other values except NaN
  381.    * <li>Positive infinity is conisdered greater than all other values except NaN
  382.    * </ul>
  383.    * <p>
  384.    * This method takes the place of the <code>&gt;</code> operator.
  385.    *
  386.    * @param   d1   the first <code>double</code> value to be compared.
  387.    * @param   d2   the second <code>double</code> value to be compared.
  388.    * @return  <code>true</code> if the first value is greater than the second value;
  389.    *          <code>false</code> otherwise.
  390.    */
  391.   public static boolean gt(long d1, long d2) {
  392.     if (isNaN(d1) || isNaN(d2)) {
  393.       return false;
  394.     } else if (d1 == ZERO) {
  395.       d1 = NEGATIVE_ZERO;
  396.     }
  397.     return (cmp(d1, d2) > 0);
  398.   }
  399.   
  400.   /**
  401.    * Returns <code>true</code> if the first argument is considered greater than
  402.    * or equal to the second argument according to 
  403.    * <a href="http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#153654">section
  404.    * 15.20.1 of the JLS</a>.  Special cases:
  405.    * <ul>
  406.    * <li>If either operand is NaN, then the result is false
  407.    * <li>Positive zero and negative zero are considered equal
  408.    * <li>Negative infinity is conisdered less than all other values except NaN
  409.    * <li>Positive infinity is conisdered greater than all other values except NaN
  410.    * </ul>
  411.    * <p>
  412.    * This method takes the place of the <code>&gt;=</code> operator.
  413.    *
  414.    * @param   d1   the first <code>double</code> value to be compared.
  415.    * @param   d2   the second <code>double</code> value to be compared.
  416.    * @return  <code>true</code> if the first value is greater than or equal to 
  417.    *          the second value; <code>false</code> otherwise.
  418.    */
  419.   public static boolean ge(long d1, long d2) {
  420.     if (isNaN(d1) || isNaN(d2)) {
  421.       return false;
  422.     } else if (d1 == NEGATIVE_ZERO) {
  423.       d1 = ZERO;
  424.     }
  425.     return (cmp(d1, d2) >= 0);
  426.   }
  427.   /**
  428.    * Mimics <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Double.html#compare(double, double)">Double.compare(double, double)</a>.
  429.    * <p>
  430.    * Note that when using this method (as well as <code>Double.compare</code>),
  431.    * the following rules apply:
  432.    * <ul><li>
  433.    * <code>NaN</code> is considered 
  434.    * to be equal to itself and greater than all other
  435.    * <code>double</code> values (including
  436.    * <code>POSITIVE_INFINITY</code>).
  437.    * <li>
  438.    * <code>0.0</code> is considered to be greater
  439.    * than <code>-0.0</code>.
  440.    * </ul>
  441.    */
  442.   public static int compare(long d1, long d2) {
  443.     boolean n1 = isNaN(d1);
  444.     boolean n2 = isNaN(d2);
  445.     if (n1 || n2) {
  446.       if (n1 && n2) {
  447.         return 0;
  448.       }
  449.       return (n1 ? 1 : -1);
  450.     }
  451.     return cmp(d1, d2);
  452.   }
  453.   /**
  454.    * Mimics <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html#max(double, double)">Math.max(double, double)</a>
  455.    */
  456.   public static long max(long d1, long d2) {
  457.     if (isNaN(d1) || isNaN(d2)) {
  458.       return NaN;
  459.     }
  460.     return ((cmp(d1, d2) >= 0) ? d1 : d2);
  461.   }
  462.   /**
  463.    * Mimics <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html#min(double, double)">Math.min(double, double)</a>
  464.    */
  465.   public static long min(long d1, long d2) {
  466.     if (isNaN(d1) || isNaN(d2)) {
  467.       return NaN;
  468.     }
  469.     return ((cmp(d1, d2) < 0) ? d1 : d2);
  470.   }
  471.   private static int cmp(long d1, long d2) {
  472.     if (d1 == d2) {
  473.       return 0;
  474.     } else if (d1 < 0L) {
  475.       if (d2 < 0L) {
  476.         return ((d1 < d2) ? 1 : -1);
  477.       }
  478.       return -1;
  479.     } else if (d2 < 0) {
  480.       return 1;
  481.     }
  482.     return ((d1 < d2) ? -1 : 1);
  483.   }
  484.   
  485.   /////////////////////////////////////////////////////////////////////////////
  486.   // Type conversion
  487.   /////////////////////////////////////////////////////////////////////////////
  488.   
  489.   /** 
  490.    * Convert the given <code>int</code> to a <code>double</code> as would happen
  491.    * in a casting operation specified by 
  492.    * <a href="http://java.sun.com/docs/books/jls/second_edition/html/conversions.doc.html#25214">section
  493.    * 5.1.2 of the JLS</a>.  This is a widening primitive conversion which 
  494.    * will result in neither a loss of magnitude nor precision.
  495.    *
  496.    * @param x the <code>int</code> to be converted
  497.    * @return the <code>double</code> representation of the argument
  498.    */
  499.   public static long intToDouble(int x) {
  500.     return longToDouble(x);
  501.   }
  502.   
  503.   /** 
  504.    * Convert the given <code>long</code> to a <code>double</code> as would happen
  505.    * in a casting operation specified by 
  506.    * <a href="http://java.sun.com/docs/books/jls/second_edition/html/conversions.doc.html#25214">section
  507.    * 5.1.2 of the JLS</a>.  This is a widening primitive conversion which 
  508.    * will not result in a loss of magnitude, but might result in a loss of
  509.    * precision.
  510.    *
  511.    * @param x the <code>long</code> to be converted
  512.    * @return the <code>double</code> representation of the argument
  513.    */
  514.   public static long longToDouble(long x) {
  515.     if (x < 0) {
  516.       return pack(true, 0, -x);
  517.     }
  518.     return pack(false, 0, x);
  519.   }
  520.   /** 
  521.    * Convert the given <code>float</code> to a <code>double</code> as would happen
  522.    * in a casting operation specified by 
  523.    * <a href="http://java.sun.com/docs/books/jls/second_edition/html/conversions.doc.html#25214">section
  524.    * 5.1.2 of the JLS</a>.  This is a widening primitive conversion which 
  525.    * will result in neither a loss of magnitude nor precision.
  526.    *
  527.    * @param f the <code>float</code> to be converted
  528.    * @return the <code>double</code> representation of the argument
  529.    */
  530.   public static long floatToDouble(int f) {
  531.     if (MicroFloat.isNaN(f)) {
  532.       return NaN;
  533.     }
  534.     boolean n = MicroFloat.unpackSign(f);
  535.     if (MicroFloat.isZero(f)) {
  536.       return (n ? NEGATIVE_ZERO : ZERO);
  537.     } else if (MicroFloat.isInfinite(f)) {
  538.       return (n ? NEGATIVE_INFINITY : POSITIVE_INFINITY);
  539.     }
  540.     int x = MicroFloat.unpackExponent(f);
  541.     long m = MicroFloat.unpackMantissa(f);
  542.     return pack(n, x, m);
  543.   }
  544.   
  545.   /** 
  546.    * Convert the given <code>double</code> to a <code>byte</code> as would happen
  547.    * in a casting operation specified by 
  548.    * <a href="http://java.sun.com/docs/books/jls/second_edition/html/conversions.doc.html#25363">section
  549.    * 5.1.3 of the JLS</a>.  This is a narrowing primitive conversion which 
  550.    * may result in a loss of magnitude and/or precision.
  551.    * <p>
  552.    * Note that this is a non-intuitive conversion.  If the argument is outside
  553.    * of the range of the byte type, the result is basically meaningless.
  554.    *
  555.    * @param d the <code>double</code> to be converted
  556.    * @return the <code>byte</code> representation of the argument
  557.    */
  558.   public static byte byteValue(long d) {
  559.     return (byte) intValue(d);
  560.   }
  561.   /** 
  562.    * Convert the given <code>double</code> to a <code>short</code> as would happen
  563.    * in a casting operation specified by 
  564.    * <a href="http://java.sun.com/docs/books/jls/second_edition/html/conversions.doc.html#25363">section
  565.    * 5.1.3 of the JLS</a>.  This is a narrowing primitive conversion which 
  566.    * may result in a loss of magnitude and/or precision.
  567.    * <p>
  568.    * Note that this is a non-intuitive conversion.  If the argument is outside
  569.    * of the range of the short type, the result is basically meaningless.
  570.    *
  571.    * @param d the <code>double</code> to be converted
  572.    * @return the <code>short</code> representation of the argument
  573.    */
  574.   public static short shortValue(long d) {
  575.     return (short) intValue(d);
  576.   }
  577.   /** 
  578.    * Convert the given <code>double</code> to an <code>int</code> as would happen
  579.    * in a casting operation specified by 
  580.    * <a href="http://java.sun.com/docs/books/jls/second_edition/html/conversions.doc.html#25363">section
  581.    * 5.1.3 of the JLS</a>.  This is a narrowing primitive conversion which 
  582.    * may result in a loss of magnitude and/or precision.
  583.    *
  584.    * @param d the <code>double</code> to be converted
  585.    * @return the <code>int</code> representation of the argument
  586.    */
  587.   public static int intValue(long d) {
  588.     long x = longValue(d);
  589.     if (x >= Integer.MAX_VALUE) {
  590.       return Integer.MAX_VALUE;
  591.     } else if (x <= Integer.MIN_VALUE) {
  592.       return Integer.MIN_VALUE;
  593.     }
  594.     return (int) x;
  595.   }
  596.   /** 
  597.    * Convert the given <code>double</code> to a <code>long</code> as would happen
  598.    * in a casting operation specified by 
  599.    * <a href="http://java.sun.com/docs/books/jls/second_edition/html/conversions.doc.html#25363">section
  600.    * 5.1.3 of the JLS</a>.  This is a narrowing primitive conversion which 
  601.    * may result in a loss of magnitude and/or precision.
  602.    *
  603.    * @param d the <code>double</code> to be converted
  604.    * @return the <code>long</code> representation of the argument
  605.    */
  606.   public static long longValue(long d) {
  607.     if (isNaN(d)) {
  608.       return 0;
  609.     }
  610.     boolean n = unpackSign(d);
  611.     int x = unpackExponent(d);
  612.     long m = unpackMantissa(d);
  613.     if (x > 0) {
  614.       if ((x >= 63) || ((m >> (63 - x)) != 0))  {
  615.         return (n ? Long.MIN_VALUE : Long.MAX_VALUE);
  616.       }
  617.       m <<= x;
  618.     } else if (x <= -53) {
  619.       return 0;
  620.     } else {
  621.       m >>>= -x;
  622.     }
  623.     return (n ? -m : m);
  624.   }
  625.   /** 
  626.    * Convert the given <code>double</code> to a <code>float</code> as would happen
  627.    * in a casting operation specified by 
  628.    * <a href="http://java.sun.com/docs/books/jls/second_edition/html/conversions.doc.html#25363">section
  629.    * 5.1.3 of the JLS</a>.  This is a narrowing primitive conversion which 
  630.    * may result in a loss of magnitude and/or precision.
  631.    *
  632.    * @param d the <code>double</code> to be converted
  633.    * @return the <code>float</code> representation of the argument
  634.    */
  635.   public static int floatValue(long d) {
  636.     return MicroFloat.doubleToFloat(d);
  637.   }
  638.   
  639.   /////////////////////////////////////////////////////////////////////////////
  640.   // Random number generation
  641.   /////////////////////////////////////////////////////////////////////////////
  642.   private static Random random;
  643.   private static synchronized Random getRandom() {
  644.     if (random == null) {
  645.       random = new java.util.Random();
  646.     }
  647.     return random;
  648.   }
  649.   
  650.   /**
  651.    * Mimics <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html#random()">Math.random()</a>
  652.    */
  653.   public static long random() {
  654.     return pack(false, -64, getRandom().nextLong() << 11);
  655.   }
  656.   
  657.   /////////////////////////////////////////////////////////////////////////////
  658.   // Basic arithmetic
  659.   /////////////////////////////////////////////////////////////////////////////
  660.   /**
  661.    * Returns the sum of the two <code>double</code> arguments according to 
  662.    * <a href="http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#13510">section
  663.    * 15.18.2 of the JLS</a>.
  664.    * <p>
  665.    * This method takes the place of the <code>+</code> operator.
  666.    *
  667.    * @param   d1   the first <code>double</code> value to be summed.
  668.    * @param   d2   the second <code>double</code> value to be summed.
  669.    * @return  the sum of the two arguments
  670.    */
  671.   public static long add(long d1, long d2) {
  672.     if (isNaN(d1) || isNaN(d2)) {
  673.       return NaN;
  674.     }
  675.     boolean n1 = unpackSign(d1);
  676.     boolean n2 = unpackSign(d2);
  677.     
  678.     // special handling of infinity
  679.     boolean i1 = isInfinite(d1);
  680.     boolean i2 = isInfinite(d2);
  681.     if (i1 || i2) {
  682.       if (i1 && i2) {
  683.         if (n1 != n2) {
  684.           // infinites of opposite sign -> NaN
  685.           return NaN;
  686.         } else {
  687.           // infinites of same sign -> infinity the same sign
  688.           return d1;
  689.         }
  690.       } else if (i1) {
  691.         return d1; // infinite + finite = infinite
  692.       } else {
  693.         return d2; // finite + infinite = infinite
  694.       }
  695.     }
  696.     
  697.     // special handling of zero
  698.     boolean z1 = isZero(d1);
  699.     boolean z2 = isZero(d2);
  700.     if (z1 || z2) {
  701.       if (z1 && z2) {
  702.         if (n1 != n2) {
  703.           // zeros of opposite sign -> positive zero
  704.           return ZERO;
  705.         } else {
  706.           return d1; // zeros of same sign -> zero of the same sign
  707.         }
  708.       } else if (z1) {
  709.         return d2; // zero + nonzero = nonzero
  710.       } else {
  711.         return d1; // nonzero + zero = nonzero
  712.       }
  713.     }
  714.     
  715.     // unpack, and add 3 guard digits
  716.     long m1 = unpackMantissa(d1) << 3;
  717.     int x1 = unpackExponent(d1) - 3;
  718.     long m2 = unpackMantissa(d2) << 3;
  719.     int x2 = unpackExponent(d2) - 3;
  720.     
  721.     // make exponents equal
  722.     int dx = x1 - x2;
  723.     if (dx > 0) {
  724.       m2 = BitUtils.stickyRightShift(m2, dx);
  725.       x2 = x1;
  726.     } else if (dx < 0) {
  727.       m1 = BitUtils.stickyRightShift(m1, -dx);
  728.       x1 = x2;
  729.     }
  730.     // if the signs are different, negate the smaller mantissa and choose
  731.     // the sign of the larger
  732.     if (n1 ^ n2) { 
  733.       if (m1 > m2) {
  734.         m2 = -m2;
  735.       } else {
  736.         m1 = -m1;
  737.         n1 = n2;
  738.       }
  739.     }
  740.     
  741.     // add (or subtract) mantissas
  742.     m1 += m2;
  743.     // pack result, and handle special case of zero (which always returns +0.0) 
  744.     long d = pack(n1, x1, m1);
  745.     if (d == NEGATIVE_ZERO) {
  746.       return ZERO;
  747.     }
  748.     return d;
  749.   }
  750.   
  751.   /**
  752.    * Returns the difference of the two <code>double</code> arguments according to 
  753.    * <a href="http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#13510">section
  754.    * 15.18.2 of the JLS</a>.
  755.    * <p>
  756.    * This method takes the place of the binary <code>-</code> operator.
  757.    *
  758.    * @param   d1   the first <code>double</code> value 
  759.    * @param   d2   the second <code>double</code> value
  760.    * @return  the difference of the two arguments
  761.    */
  762.   public static long sub(long d1, long d2) {
  763.     return add(d1, negate(d2));
  764.   }
  765.   /**
  766.    * Returns the product of the two <code>double</code> arguments according to 
  767.    * <a href="http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5036">section
  768.    * 15.17.1 of the JLS</a>.
  769.    * <p>
  770.    * This method takes the place of the <code>*</code> operator.
  771.    *
  772.    * @param   d1   the first <code>double</code> value
  773.    * @param   d2   the second <code>double</code> value
  774.    * @return  the product of the two arguments
  775.    */
  776.   public static long mul(long d1, long d2) {
  777.     if (isNaN(d1) || isNaN(d2)) {
  778.       return NaN;
  779.     }
  780.     boolean negative = unpackSign(d1) ^ unpackSign(d2);
  781.     
  782.     // special handling of infinity
  783.     if (isInfinite(d1) || isInfinite(d2)) {
  784.       if (isZero(d1) || isZero(d2)) {
  785.         return NaN;
  786.       } else {
  787.         return (negative ? NEGATIVE_INFINITY : POSITIVE_INFINITY);
  788.       }
  789.     }
  790.     
  791.     // unpack
  792.     long m1 = unpackMantissa(d1);
  793.     int x1 = unpackExponent(d1);
  794.     long m2 = unpackMantissa(d2);
  795.     int x2 = unpackExponent(d2);
  796.     
  797.     // compute the resultant exponent
  798.     x1 += x2;
  799.     
  800.     // compute the resultant mantissa using double-precision integer 
  801.     // multiplication with 28 bit words
  802.     long m11 = m1 & 0x0fffffff;
  803.     long m12 = m1 >> 28;
  804.     long m21 = m2 & 0x0fffffff;
  805.     long m22 = m2 >> 28;
  806.     
  807.     long t1 = m11 * m21;
  808.     long t2 = (m11 * m22) + (m12 * m21);
  809.     long t3 = m12 * m22;
  810.     
  811.     t1 += (t2 & 0x0fffffff) << 28;
  812.     t3 += t2 >>> 28;
  813.     t3 += t1 >>> 56;
  814.     t1 <<= 8;
  815.     // the 128 bit result is now in t3t1
  816.     if (t3 == 0) {
  817.       // the high 64 bits are zero and can be ignored.
  818.       return pack(negative, x1, t1);
  819.     }
  820.     
  821.     // shift the result left into t3 and discard excess precision
  822.     int s = BitUtils.countLeadingZeros(t3);
  823.     x1 += 56 - s;
  824.     t3 <<= s;
  825.     t3 |= t1 >>> (64 - s);
  826.     if ((t1 << s) != 0) {
  827.       // discarded low bits go into the sticky bit
  828.       t3 |= 1;
  829.     }
  830.     
  831.     // round and pack the result
  832.     return pack(negative, x1, t3);
  833.   }
  834.   
  835.   /**
  836.    * Returns the quotient of the two <code>double</code> arguments according to 
  837.    * <a href="http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#5047">section
  838.    * 15.17.2 of the JLS</a>.
  839.    * <p>
  840.    * This method takes the place of the <code>/</code> operator.
  841.    *
  842.    * @param   d1   the <code>double</code> dividend 
  843.    * @param   d2   the <code>double</code> divisor
  844.    * @return  the quotient of the two arguments
  845.    */
  846.   public static long div(long d1, long d2) {
  847.     if (isNaN(d1) || isNaN(d2)) {
  848.       return NaN;
  849.     }
  850.     boolean negative = unpackSign(d1) ^ unpackSign(d2);
  851.     
  852.     // special handling of infinity
  853.     boolean n1 = isInfinite(d1);
  854.     boolean n2 = isInfinite(d2);
  855.     if (n1 || n2) {
  856.       if (n1 && n2) {
  857.         return NaN;
  858.       } else if (n1) {
  859.         return (negative ? NEGATIVE_INFINITY : POSITIVE_INFINITY);
  860.       } else {
  861.         return (negative ? NEGATIVE_ZERO : ZERO);
  862.       }
  863.     }
  864.     // neither value is infinite
  865.     
  866.     // special handling of zero
  867.     n1 = isZero(d1);
  868.     n2 = isZero(d2);
  869.     if (n1 || n2) {
  870.       if (n1 && n2) {
  871.         return NaN;
  872.       } else if (n1) {
  873.         return (negative ? NEGATIVE_ZERO : ZERO);
  874.       } else {
  875.         return (negative ? NEGATIVE_INFINITY : POSITIVE_INFINITY);
  876.       }
  877.     }
  878.     // neither value is zero
  879.     
  880.     // unpack
  881.     long m1 = unpackMantissa(d1);
  882.     int x1 = unpackExponent(d1);
  883.     long m2 = unpackMantissa(d2);
  884.     int x2 = unpackExponent(d2);
  885.     // shift, divide, mod, repeat
  886.     long m = 0;
  887.     x1 -= x2;
  888.     while (true) {
  889.       int s = Math.min(BitUtils.countLeadingZeros(m1) - 1, 
  890.               BitUtils.countLeadingZeros(m));
  891.       if (s <= 8) {
  892.         if (m1 != 0) {
  893.           m |= 1;
  894.         }
  895.         break;
  896.       }
  897.       m1 <<= s;
  898.       m <<= s;
  899.       x1 -= s;
  900.       m |= m1 / m2;
  901.       m1 %= m2;
  902.     }
  903.     return pack(negative, x1, m);
  904.   }
  905.   
  906.   /**
  907.    * Returns the remainder of the two <code>double</code> arguments according to 
  908.    * <a href="http://java.sun.com/docs/books/jls/second_edition/html/expressions.doc.html#24956">section
  909.    * 15.17.3 of the JLS</a>.
  910.    * <p>
  911.    * This method takes the place of the <code>%</code> operator.
  912.    *
  913.    * @param   d1   the <code>double</code> dividend 
  914.    * @param   d2   the <code>double</code> divisor
  915.    * @return  the remainder of the two arguments
  916.    * @see #IEEEremainder(long, long)
  917.    */
  918.   public static long mod(long d1, long d2) {
  919.     if (isNaN(d1) || isNaN(d2) || isInfinite(d1) || isZero(d2)) {
  920.       return NaN;
  921.     } else if (isZero(d1) || isInfinite(d2)) {
  922.       return d1;
  923.     }
  924.     
  925.     // unpack
  926.     int x1 = unpackExponent(d1);
  927.     int x2 = unpackExponent(d2);
  928.     if (x1 < x2) {
  929.       return d1;
  930.     }
  931.     boolean n = unpackSign(d1);
  932.     long m1 = unpackMantissa(d1);
  933.     long m2 = unpackMantissa(d2);
  934.     if (x1 == x2) {
  935.       m1 %= m2;
  936.     } else {
  937.       // reduce m1 by left shifting and modding until the exponents x1 and x2 are 
  938.       // equal
  939.       while (x1 != x2) {
  940.         int s = Math.min(BitUtils.countLeadingZeros(m1) - 1, x1 - x2);
  941.         x1 -= s;
  942.         m1 = (m1 << s) % m2;
  943.       }
  944.     }
  945.     return pack(n, x1, m1);
  946.   }
  947.   
  948.   /////////////////////////////////////////////////////////////////////////////
  949.   // Rounding
  950.   /////////////////////////////////////////////////////////////////////////////
  951.   
  952.   /**
  953.    * Returns the <code>double</code> of greatest magnitude (furthest from zero)
  954.    * that is equal to a mathematical integer and which has a mignitude not
  955.    * greater than the argument's magnitude.  Special cases:
  956.    * <ul><li>If the argument value is already equal to a mathematical 
  957.    * integer, then the result is the same as the argument. 
  958.    * <li>If the argument is NaN or an infinity or positive zero or 
  959.    * negative zero, then the result is the same as the argument.</ul>
  960.    *
  961.    * @param   d   a <code>double</code> value.
  962.    * @return the <code>double</code> of greatest magnitude (furthest from zero)
  963.    *         whose magnitude is not greater than the argument's and which 
  964.    *         is equal to a mathematical integer.
  965.    */
  966.   public static long truncate(long d) {
  967.     return round(d, false, unpackSign(d));
  968.   }
  969.   /**
  970.    * Mimics <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html#rint(double)">Math.rint(double)</a>.
  971.    */
  972.   public static long rint(long d) {
  973.     return round(d, true, false);
  974.   }
  975.   
  976.   /**
  977.    * Mimics <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html#floor(double)">Math.floor(double)</a>.
  978.    */
  979.   public static long floor(long d) {
  980.     return round(d, false, false);
  981.   }
  982.   
  983.   /**
  984.    * Mimcs <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html#ceil(double)">Math.ceil(double)</a>.
  985.    */
  986.   public static long ceil(long d) {
  987.     return round(d, false, true);
  988.   }
  989.   /**
  990.    * Mimcs <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html#round(double)">Math.round(double)</a>.
  991.    */
  992.   public static long round(long d) {
  993.     return longValue(floor(add(d, ONE_HALF)));
  994.   }
  995.   private static long round(long d, boolean round, boolean ceil) {
  996.     if (isNaN(d)) {
  997.       return NaN;
  998.     } else if (isZero(d) || isInfinite(d)) {
  999.       return d;
  1000.     }
  1001.     int x = unpackExponent(d);
  1002.     if (x >= 0) {
  1003.       return d;
  1004.     }
  1005.     boolean n = unpackSign(d);
  1006.     long m = unpackMantissa(d);
  1007.     if (round) {
  1008.       m = BitUtils.roundingRightShift(m, -x);
  1009.     } else {
  1010.       long r;
  1011.       if (x <= -64) {
  1012.         r = m;
  1013.         m = 0;
  1014.       } else {
  1015.         r = m << (64 + x);
  1016.         m >>>= -x;
  1017.       }
  1018.       if ((n ^ ceil) && (r != 0)) {
  1019.         m++;
  1020.       }
  1021.     }
  1022.     return pack(n, 0, m);
  1023.   }
  1024.   
  1025.   /////////////////////////////////////////////////////////////////////////////
  1026.   // String Conversion
  1027.   /////////////////////////////////////////////////////////////////////////////
  1028.   
  1029.   // decimal -> binary 
  1030.   
  1031.   // base 2 mantissas for 10**-345 through 10**309, at intervals of 1000
  1032.   private static final long[] pow10m = {
  1033.           0xf4b0769e47eb5a79L, 0xeef453d6923bd65aL, 0xe95a99df8ace6f54L, 
  1034.           0xe3e27a444d8d98b8L, 0xde8b2b66b3bc4724L, 0xd953e8624b85dd79L, 
  1035.           0xd43bf0effdc0ba48L, 0xcf42894a5dce35eaL, 0xca66fa129f9b60a7L, 
  1036.           0xc5a890362fddbc63L, 0xc1069cd4eabe89f9L, 0xbc807527ed3e12bdL, 
  1037.           0xb8157268fdae9e4cL, 0xb3c4f1ba87bc8697L, 0xaf8e5410288e1b6fL, 
  1038.           0xab70fe17c79ac6caL, 0xa76c582338ed2622L, 0xa37fce126597973dL, 
  1039.           0x9faacf3df73609b1L, 0x9becce62836ac577L, 0x9845418c345644d7L, 
  1040.           0x94b3a202eb1c3f39L, 0x91376c36d99995beL, 0x8dd01fad907ffc3cL, 
  1041.           0x8a7d3eef7f1cfc52L, 0x873e4f75e2224e68L, 0x8412d9991ed58092L, 
  1042.           0x80fa687f881c7f8eL, 0xfbe9141915d7a922L, 0xf6019da07f549b2bL, 
  1043.           0xf03d93eebc589f88L, 0xea9c227723ee8bcbL, 0xe51c79a85916f485L, 
  1044.           0xdfbdcece67006ac9L, 0xda7f5bf590966849L, 0xd5605fcdcf32e1d7L, 
  1045.           0xd0601d8efc57b08cL, 0xcb7ddcdda26da269L, 0xc6b8e9b0709f109aL, 
  1046.           0xc21094364dfb5637L, 0xbd8430bd08277231L, 0xb913179899f68584L, 
  1047.           0xb4bca50b065abe63L, 0xb080392cc4349dedL, 0xac5d37d5b79b6239L, 
  1048.           0xa8530886b54dbdecL, 0xa46116538d0deb78L, 0xa086cfcd97bf97f4L, 
  1049.           0x9cc3a6eec6311a64L, 0x991711052d8bf3c5L, 0x9580869f0e7aac0fL, 
  1050.           0x91ff83775423cc06L, 0x8e938662882af53eL, 0x8b3c113c38f9f37fL, 
  1051.           0x87f8a8d4cfa417caL, 0x84c8d4dfd2c63f3bL, 0x81ac1fe293d599c0L, 
  1052.           0xfd442e4688bd304bL, 0xf7549530e188c129L, 0xf18899b1bc3f8ca2L, 
  1053.           0xebdf661791d60f56L, 0xe65829b3046b0afaL, 0xe0f218b8d25088b8L, 
  1054.           0xdbac6c247d62a584L, 0xd686619ba27255a3L, 0xd17f3b51fca3a7a1L, 
  1055.           0xcc963fee10b7d1b3L, 0xc7caba6e7c5382c9L, 0xc31bfa0fe5698db8L, 
  1056.           0xbe89523386091466L, 0xba121a4650e4ddecL, 0xb5b5ada8aaff80b8L, 
  1057.           0xb1736b96b6fd83b4L, 0xad4ab7112eb3929eL, 0xa93af6c6c79b5d2eL, 
  1058.           0xa54394fe1eedb8ffL, 0xa163ff802a3426a9L, 0x9d9ba7832936edc1L, 
  1059.           0x99ea0196163fa42eL, 0x964e858c91ba2655L, 0x92c8ae6b464fc96fL, 
  1060.           0x8f57fa54c2a9eab7L, 0x8bfbea76c619ef36L, 0x88b402f7fd75539bL, 
  1061.           0x857fcae62d8493a5L, 0x825ecc24c8737830L, 0xfea126b7d78186bdL, 
  1062.           0xf8a95fcf88747d94L, 0xf2d56790ab41c2a3L, 0xed246723473e3813L, 
  1063.           0xe7958cb87392c2c3L, 0xe2280b6c20dd5232L, 0xdcdb1b2798182245L, 
  1064.           0xd7adf884aa879177L, 0xd29fe4b18e88640fL, 0xcdb02555653131b6L, 
  1065.           0xc8de047564d20a8cL, 0xc428d05aa4751e4dL, 0xbf8fdb78849a5f97L, 
  1066.           0xbb127c53b17ec159L, 0xb6b00d69bb55c8d1L, 0xb267ed1940f1c61cL, 
  1067.           0xae397d8aa96c1b78L, 0xaa242499697392d3L, 0xa6274bbdd0fadd62L, 
  1068.           0xa2425ff75e14fc32L, 0x9e74d1b791e07e48L, 0x9abe14cd44753b53L, 
  1069.           0x971da05074da7befL, 0x9392ee8e921d5d07L, 0x901d7cf73ab0acd9L, 
  1070.           0x8cbccc096f5088ccL, 0x89705f4136b4a597L, 0x8637bd05af6c69b6L, 
  1071.           0x83126e978d4fdf3bL, 0x8000000000000000L, 0xfa00000000000000L, 
  1072.           0xf424000000000000L, 0xee6b280000000000L, 0xe8d4a51000000000L, 
  1073.           0xe35fa931a0000000L, 0xde0b6b3a76400000L, 0xd8d726b7177a8000L, 
  1074.           0xd3c21bcecceda100L, 0xcecb8f27f4200f3aL, 0xc9f2c9cd04674edfL, 
  1075.           0xc5371912364ce305L, 0xc097ce7bc90715b3L, 0xbc143fa4e250eb31L, 
  1076.           0xb7abc627050305aeL, 0xb35dbf821ae4f38cL, 0xaf298d050e4395d7L, 
  1077.           0xab0e93b6efee0054L, 0xa70c3c40a64e6c52L, 0xa321f2d7226895c8L, 
  1078.           0x9f4f2726179a2245L, 0x9b934c3b330c8577L, 0x97edd871cfda3a57L, 
  1079.           0x945e455f24fb1cf9L, 0x90e40fbeea1d3a4bL, 0x8d7eb76070a08aedL, 
  1080.           0x8a2dbf142dfcc7abL, 0x86f0ac99b4e8dafdL, 0x83c7088e1aab65dbL, 
  1081.           0x80b05e5ac60b6178L, 0xfb5878494ace3a5fL, 0xf5746577930d6501L, 
  1082.           0xefb3ab16c59b14a3L, 0xea1575143cf97227L, 0xe498f455c38b997aL, 
  1083.           0xdf3d5e9bc0f653e1L, 0xda01ee641a708deaL, 0xd4e5e2cdc1d1ea96L, 
  1084.           0xcfe87f7cef46ff17L, 0xcb090c8001ab551cL, 0xc646d63501a1511eL, 
  1085.           0xc1a12d2fc3978937L, 0xbd176620a501fc00L, 0xb8a8d9bbe123f018L, 
  1086.           0xb454e4a179dd1877L, 0xb01ae745b101e9e4L, 0xabfa45da0edbde69L, 
  1087.           0xa7f26836f282b733L, 0xa402b9c5a8d3a6e7L, 0xa02aa96b06deb0feL, 
  1088.           0x9c69a97284b578d8L, 0x98bf2f79d5993803L, 0x952ab45cfa97a0b3L, 
  1089.           0x91abb422ccb812efL, 0x8e41ade9fbebc27dL, 0x8aec23d680043beeL, 
  1090.           0x87aa9aff79042287L, 0x847c9b5d7c2e09b7L, 0x8161afb94b44f57dL, 
  1091.           0xfcb2cb35e702af78L, 0xf6c69a72a3989f5cL, 0xf0fdf2d3f3c30b9fL, 
  1092.           0xeb57ff22fc0c795aL, 0xe5d3ef282a242e82L, 0xe070f78d3927556bL, 
  1093.           0xdb2e51bfe9d0696aL, 0xd60b3bd56a5586f2L, 0xd106f86e69d785c8L, 
  1094.           0xcc20ce9bd35c78a5L, 0xc75809c42c684dd1L, 0xc2abf989935ddbfeL, 
  1095.           0xbe1bf1b059e9a8d6L, 0xb9a74a0637ce2ee1L, 0xb54d5e4a127f59c8L, 
  1096.           0xb10d8e1456105dadL, 0xace73cbfdc0bfb7bL, 0xa8d9d1535ce3b396L, 
  1097.           0xa4e4b66b68b65d61L, 0xa1075a24e4421731L, 0x9d412e0806e88aa6L, 
  1098.           0x9991a6f3d6bf1766L, 0x95f83d0a1fb69cd9L, 0x92746b9be2f8552cL, 
  1099.           0x8f05b1163ba6832dL, 0x8bab8eefb6409c1aL, 0x8865899617fb1871L, 
  1100.           0x8533285c936b35dfL, 0x8213f56a67f6b29cL, 0xfe0efb53d30dd4d8L, 
  1101.           0xf81aa16fdc1b81dbL, 0xf24a01a73cf2dcd0L, 0xec9c459d51852ba3L, 
  1102.           0xe7109bfba19c0c9dL, 0xe1a63853bbd26451L, 0xdc5c5301c56b75f7L, 
  1103.           0xd732290fbacaf134L, 0xd226fc195c6a2f8cL, 0xcd3a1230c43fb26fL, 
  1104.           0xc86ab5c39fa63441L, 0xc3b8358109e84f07L, 0xbf21e44003acdd2dL, 
  1105.           0xbaa718e68396cffeL, 0xb6472e511c81471eL, 0xb201833b35d63f73L, 
  1106.   };
  1107.   
  1108.   // base 2 exponents for 10**-345 through 10**309, at intervals of 1000
  1109.   private static final short[] pow10x = {
  1110.           -1146, -1136, -1126, -1116, -1106, -1096, -1086, -1076, 
  1111.           -1066, -1056, -1046, -1036, -1026, -1016, -1006, -996, 
  1112.           -986, -976, -966, -956, -946, -936, -926, -916, 
  1113.           -906, -896, -886, -876, -867, -857, -847, -837, 
  1114.           -827, -817, -807, -797, -787, -777, -767, -757, 
  1115.           -747, -737, -727, -717, -707, -697, -687, -677, 
  1116.           -667, -657, -647, -637, -627, -617, -607, -597, 
  1117.           -587, -578, -568, -558, -548, -538, -528, -518, 
  1118.           -508, -498, -488, -478, -468, -458, -448, -438, 
  1119.           -428, -418, -408, -398, -388, -378, -368, -358, 
  1120.           -348, -338, -328, -318, -308, -298, -289, -279, 
  1121.           -269, -259, -249, -239, -229, -219, -209, -199, 
  1122.           -189, -179, -169, -159, -149, -139, -129, -119, 
  1123.           -109, -99, -89, -79, -69, -59, -49, -39, 
  1124.           -29, -19, -9, 1, 10, 20, 30, 40, 
  1125.           50, 60, 70, 80, 90, 100, 110, 120, 
  1126.           130, 140, 150, 160, 170, 180, 190, 200, 
  1127.           210, 220, 230, 240, 250, 260, 270, 280, 
  1128.           290, 299, 309, 319, 329, 339, 349, 359, 
  1129.           369, 379, 389, 399, 409, 419, 429, 439, 
  1130.           449, 459, 469, 479, 489, 499, 509, 519, 
  1131.           529, 539, 549, 559, 569, 579, 588, 598, 
  1132.           608, 618, 628, 638, 648, 658, 668, 678, 
  1133.           688, 698, 708, 718, 728, 738, 748, 758, 
  1134.           768, 778, 788, 798, 808, 818, 828, 838, 
  1135.           848, 858, 868, 877, 887, 897, 907, 917, 
  1136.           927, 937, 947, 957, 967, 977, 987, 997, 
  1137.           1007, 1017, 1027, 
  1138.   };
  1139.   private static long decToDouble(boolean negative, int base10x, long base10m) {
  1140.     if (base10m == 0) {
  1141.       return (negative ? NEGATIVE_ZERO : ZERO);
  1142.     }
  1143.     // maximize base10m to ensure consistency between toString and parseDouble
  1144.     while ((base10m > 0) && (base10m <= 0x1999999999999999L)) { // (Long.MAX_VALUE / 5))) {
  1145.       base10m = (base10m << 3) + (base10m << 1);
  1146.       base10x--;
  1147.     }
  1148.     // base10x needs to be a multiple of 3, because the tables are
  1149.     // spaced at intervals of 1000 (not 10).
  1150.     base10x += 345;
  1151.     int mod = base10x % 3;
  1152.     base10x /= 3;
  1153.     if (base10x < 0) { // -345
  1154.       return (negative ? NEGATIVE_ZERO : ZERO);
  1155.     } else if (base10x > 218) { // 309
  1156.       return (negative ? NEGATIVE_INFINITY : POSITIVE_INFINITY);
  1157.     }
  1158.     int base2x = pow10x[base10x];
  1159.     int s = BitUtils.countLeadingZeros(base10m);
  1160.     base10m <<= s;
  1161.     base2x -= s;
  1162.     long base2m = dpMul(base10m, pow10m[base10x]);
  1163.     while (mod > 0) {
  1164.       if (base2m < 0) {
  1165.         base2m >>>= 1;
  1166.         base2x++;
  1167.       }
  1168.       base2m += base2m >>> 2;
  1169.       base2x += 3;
  1170.       mod--;
  1171.     }
  1172.     return pack(negative, base2x, base2m);
  1173.   }
  1174.   /**
  1175.    * Double-precision integer multiplication of x1 and x2.
  1176.    */
  1177.   private static final long dpMul(long x1, long x2) {
  1178.     long v1 = (x1 >>> 32)        * (x2 >>> 32);
  1179.     long v2 = (x1 & 0xffffffffL) * (x2 >>> 32);
  1180.     long v3 = (x1 >>> 32)        * (x2 & 0xffffffffL);
  1181.     v1 += v2 >>> 32;
  1182.     v1 += v3 >>> 32;
  1183.     if (((v2 + v3) << 32) < 0) {
  1184.       v1++;
  1185.     }
  1186.     return v1;
  1187.   }
  1188.   
  1189.   /**
  1190.    * Mimics <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Double.html#parseDouble(String)">Double.parseDouble(String)</a>.
  1191.    * <p>
  1192.    * See the notes on <code>toString</code> for some caveats on String 
  1193.    * conversion.
  1194.    *
  1195.    * @see #toString
  1196.    * @exception  NumberFormatException  if the string does not contain a
  1197.    *               parsable number.
  1198.    */
  1199.   public static long parseDouble(String s) {
  1200.     // remove leading & trailing whitespace
  1201.     s = s.trim().toUpperCase();
  1202.     
  1203.     // check length
  1204.     int len = s.length();
  1205.     if (len == 0) {
  1206.       throw new NumberFormatException(s);
  1207.     }
  1208.     
  1209.     // check for NaN
  1210.     if ("NAN".equals(s)) {
  1211.       return NaN;
  1212.     }
  1213.     
  1214.     // begin parsing, one character at a time
  1215.     int idx = 0;
  1216.     
  1217.     // read sign
  1218.     boolean negative = false;
  1219.     char c = s.charAt(0);
  1220.     negative = (c == '-');
  1221.     if (negative || (c == '+')) {
  1222.       idx = 1;
  1223.     }
  1224.     // check for "Infinity"
  1225.     if (idx < len) {
  1226.       c = s.charAt(idx);
  1227.       if ((c == 'I') || (c == 'i')) {
  1228.         if ("INFINITY".equals(s.substring(idx))) {
  1229.           return (negative ? NEGATIVE_INFINITY : POSITIVE_INFINITY);
  1230.         }
  1231.       }
  1232.     }
  1233.     // read Digits.Digits
  1234.     long mantissa = 0;
  1235.     int exponent = 0;
  1236.     int fractionChars = 0;
  1237.     boolean sticky = false;
  1238.     boolean readingFraction = false;
  1239.     while (idx < len) {
  1240.       c = s.charAt(idx);
  1241.       if (c == '.') {
  1242.         if (readingFraction) {
  1243.           throw new NumberFormatException(s);
  1244.         }
  1245.         readingFraction = true;
  1246.       } else if ((c < '0') || (c > '9')) {
  1247.         break;
  1248.       } else {
  1249.         fractionChars++;
  1250.         if (mantissa <= 0x1999999999999998L) { // ((Long.MAX_VALUE / 5) - 1)
  1251.           mantissa = (mantissa << 3) + (mantissa << 1) + (c - '0');
  1252.           if (readingFraction) {
  1253.             exponent--;
  1254.           }
  1255.         } else {
  1256.           if (! readingFraction) {
  1257.             exponent++;
  1258.           }
  1259.           sticky |= (c != '0');
  1260.         }
  1261.       }
  1262.       idx++;
  1263.     }
  1264.     if (fractionChars == 0) {
  1265.       throw new NumberFormatException(s);
  1266.     }
  1267.     
  1268.     // read exponent
  1269.     if (((idx + 1) < len) && ((s.charAt(idx) == 'E') || (s.charAt(idx) == 'e'))) {
  1270.       try {
  1271.         exponent += Integer.parseInt(s.substring(idx + 1));
  1272.       } catch (NumberFormatException e) {
  1273.         throw new NumberFormatException(s);
  1274.       }
  1275.       idx = len;
  1276.     } else if (idx != len) {
  1277.       // check that we parsed the entire string
  1278.       throw new NumberFormatException(s);
  1279.     }
  1280.     // convert the decimal to a float
  1281.     return decToDouble(negative, exponent, mantissa);
  1282.   }
  1283.   // binary -> decimal
  1284.   
  1285.   // base 10 mantissas for 2**-1075 through 2**972, at intervals of 2**11
  1286.   private static final long[] pow2m = {
  1287.           0x3f3d8b077b8e0b11L, 0x81842f29f2cce376L, 0x1a8662f3b3919708L, 
  1288.           0x3652b62c71ce021dL, 0x6f40f20501a5e7a8L, 0xe3d8f9e563a198e5L, 
  1289.           0x2ea9c639a0e5b3ffL, 0x5f90f22001d66e96L, 0xc3b8358109e84f07L, 
  1290.           0x2815578d865470daL, 0x52173a79e8197a93L, 0xa81f301449ee8c70L, 
  1291.           0x226e6cf846d8ca6fL, 0x4683f19a2ab1bf59L, 0x906a617d450187e2L, 
  1292.           0x1d9388b3aa30a574L, 0x3c928069cf3cb734L, 0x7c0d50b7ee0dc0edL, 
  1293.           0xfe0efb53d30dd4d8L, 0x3407fbc42995e10bL, 0x6a8f537d42bc2b19L, 
  1294.           0xda3c0f568cc4f3e9L, 0x2cb1c756f2a408feL, 0x5b88c3416ddb353cL, 
  1295.           0xbb764c4ca7a44410L, 0x266469bcf5afc5d9L, 0x4ea0970403744553L, 
  1296.           0xa1075a24e4421731L, 0x20fa8ae248247913L, 0x438a53baf1f4ae3cL, 
  1297.           0x8a5296ffe33cc930L, 0x1c5416bb92e3e607L, 0x3a044721f1706ea6L, 
  1298.           0x76d1770e38320986L, 0xf356f7ebf83552feL, 0x31d602710b1a1374L, 
  1299.           0x6610674de9ae3c53L, 0xd106f86e69d785c8L, 0x2acf0bf77baab497L, 
  1300.           0x57ac20b32a535d5eL, 0xb38d92d760ec4455L, 0x24c5bfdd7761f2f6L, 
  1301.           0x4b4f5be23c2cf3a2L, 0x9a3c2087a63f6399L, 0x1f965966bce055efL, 
  1302.           0x40b0d7dca5a27abfL, 0x847c9b5d7c2e09b7L, 0x1b221effe500d3b5L, 
  1303.           0x3791a7ef666817f9L, 0x71ce24bb2fefcecaL, 0xe912b9d1478ceb17L, 
  1304.           0x2fbbbed612bfe181L, 0x61c209e792f16b87L, 0xc83553c5c8965d3dL, 
  1305.           0x2900ae716a34e9baL, 0x53f9341b79415b99L, 0xabfa45da0edbde69L, 
  1306.           0x233894a789cd2ec7L, 0x4821f50d63f209c9L, 0x93ba47c980e98ce0L, 
  1307.           0x1e412f0f768fad71L, 0x3df622f090826959L, 0x7ee5a7d0010b1532L, 
  1308.           0x19fd0fef9de8dfe3L, 0x353978b370747aa6L, 0x6d00f7320d3846f5L, 
  1309.           0xdf3d5e9bc0f653e1L, 0x2db830ddf3e8b84cL, 0x5da22ed4e5309410L, 
  1310.           0xbfc2ef456ae276e9L, 0x2745d2cb73b0391fL, 0x506e3af8bbc71cebL, 
  1311.           0xa4b8cab1a1563f52L, 0x21bc2b266d3a36bfL, 0x4516df8a16fe63d6L, 
  1312.           0x8d7eb76070a08aedL, 0x1cfa698c95390ba9L, 0x3b58e88c75313ecaL, 
  1313.           0x798b138e3fe1c845L, 0xf8ebad2b84e0d58cL, 0x32fa9be33ac0aeceL, 
  1314.           0x6867a5a867f103b3L, 0xd5d238a4abe98068L, 0x2bca63414390e576L, 
  1315.           0x59aedfc10d7279c6L, 0xb7abc627050305aeL, 0x259da6542d43623dL, 
  1316.           0x4d0985cb1d3608aeL, 0x9dc5ada82b70b59eL, 0x204fce5e3e250261L, 
  1317.           0x422ca8b0a00a4250L, 0x878678326eac9000L, 0x1bc16d674ec80000L, 
  1318.           0x38d7ea4c68000000L, 0x746a528800000000L, 0xee6b280000000000L, 
  1319.           0x30d4000000000000L, 0x6400000000000000L, 0xcccccccccccccccdL, 
  1320.           0x29f16b11c6d1e109L, 0x55e63b88c230e77eL, 0xafebff0bcb24aaffL, 
  1321.           0x24075f3dceac2b36L, 0x49c97747490eae84L, 0x971da05074da7befL, 
  1322.           0x1ef2d0f5da7dd8aaL, 0x3f61ed7ca0c03283L, 0x81ceb32c4b43fcf5L, 
  1323.           0x1a95a5b7f87a0ef1L, 0x3671f73b54f1c895L, 0x6f80f42fc8971bd2L, 
  1324.           0xe45c10c42a2b3b06L, 0x2ec49f14ec5fb056L, 0x5fc7edbc424d2fcbL, 
  1325.           0xc428d05aa4751e4dL, 0x282c674aadc39bb6L, 0x524675555bad4716L, 
  1326.           0xa87fea27a539e9a5L, 0x22823c3e2fc3c55bL, 0x46ac8391ca4529b0L, 
  1327.           0x90bd77f3483bb9baL, 0x1da48ce468e7c702L, 0x3cb559e42ad070a9L, 
  1328.           0x7c54afe7c43a3ecaL, 0xfea126b7d78186bdL, 0x3425eb41e9c7c9adL, 
  1329.           0x6acca251be03a951L, 0xdab99e59958885c5L, 0x2ccb7e3a7cd51959L, 
  1330.           0x5bbd6d030bf1dde6L, 0xbbe226efb628afebL, 0x267a8065858fe90cL, 
  1331.           0x4ecdd3c1949b76e0L, 0xa163ff802a3426a9L, 0x210d8432d2fc5833L, 
  1332.           0x43b12f82b63e2546L, 0x8aa22c0dbef60ee4L, 0x1c6463225ab7ec1dL, 
  1333.           0x3a25a835f947855aL, 0x7715d36033c5acc0L, 0xf3e2f893dec3f126L, 
  1334.           0x31f2ae9b9f14e0b2L, 0x664b1ff7085be8daL, 0xd17f3b51fca3a7a1L, 
  1335.           0x2ae7ad1f207d4454L, 0x57de91a832277568L, 0xb3f4e093db73a093L, 
  1336.           0x24dae7f3aec97265L, 0x4b7ab0078ad3dbf3L, 0x9a94dd3e8cf578baL, 
  1337.           0x1fa885c8d117a609L, 0x40d60ff149eacce0L, 0x84c8d4dfd2c63f3bL, 
  1338.           0x1b31bb5dc320d18fL, 0x37b1a07e7d30c7ccL, 0x720f9eb539bbf765L, 
  1339.           0xe998d258869facd7L, 0x2fd735519e3bbc2eL, 0x61fa48553bdeb07eL, 
  1340.           0xc8a883c0fdaf7df0L, 0x29184594e3437adeL, 0x542984435aa6def6L, 
  1341.           0xac5d37d5b79b6239L, 0x234cd83c273db92fL, 0x484b75379c244c28L, 
  1342.           0x940f4613ae5ed137L, 0x1e5297287c2f4579L, 0x3e19c9072331b530L, 
  1343.           0x7f2eaa0a85848581L, 0x1a0c03b1df8af611L, 0x355817f373ccb876L, 
  1344.           0x6d3fadfac84b3424L, 0xdfbdcece67006ac9L, 0x2dd27ebb4504974eL, 
  1345.           0x5dd80dc941929e51L, 0xc0314325637a193aL, 0x275c6b23eb69b26dL, 
  1346.           0x509c814fb511cfb9L, 0xa5178fff668ae0b6L, 0x21cf93dd7888939aL, 
  1347.           0x453e9f77bf8e7e29L, 0x8dd01fad907ffc3cL, 0x1d0b15a491eb8459L, 
  1348.           0x3b7b0d9ac471b2e4L, 0x79d1013cf6ab6a45L, 0xf97ae3d0d2446f25L, 
  1349.           0x3317f065bfbf5f43L
  1350.  };
  1351.           
  1352.   // base 10 exponents for 2**-1075 through 2**972, at intervals of 2**11
  1353.   private static final short[] pow2x = {
  1354.           -323, -320, -316, -313, -310, -307, -303, -300, 
  1355.           -297, -293, -290, -287, -283, -280, -277, -273, 
  1356.           -270, -267, -264, -260, -257, -254, -250, -247, 
  1357.           -244, -240, -237, -234, -230, -227, -224, -220, 
  1358.           -217, -214, -211, -207, -204, -201, -197, -194, 
  1359.           -191, -187, -184, -181, -177, -174, -171, -167, 
  1360.           -164, -161, -158, -154, -151, -148, -144, -141, 
  1361.           -138, -134, -131, -128, -124, -121, -118, -114, 
  1362.           -111, -108, -105, -101, -98, -95, -91, -88, 
  1363.           -85, -81, -78, -75, -71, -68, -65, -62, 
  1364.           -58, -55, -52, -48, -45, -42, -38, -35, 
  1365.           -32, -28, -25, -22, -18, -15, -12, -9, 
  1366.           -5, -2, 1, 5, 8, 11, 15, 18, 
  1367.           21, 25, 28, 31, 35, 38, 41, 44, 
  1368.           48, 51, 54, 58, 61, 64, 68, 71, 
  1369.           74, 78, 81, 84, 87, 91, 94, 97, 
  1370.           101, 104, 107, 111, 114, 117, 121, 124, 
  1371.           127, 131, 134, 137, 140, 144, 147, 150, 
  1372.           154, 157, 160, 164, 167, 170, 174, 177, 
  1373.           180, 184, 187, 190, 193, 197, 200, 203, 
  1374.           207, 210, 213, 217, 220, 223, 227, 230, 
  1375.           233, 237, 240, 243, 246, 250, 253, 256, 
  1376.           260, 263, 266, 270, 273, 276, 280, 283, 
  1377.           286, 289, 293 
  1378.   } ;
  1379.   /**
  1380.    * Mimics <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Double.html#toString(double)">Double.toString(double)</a>.
  1381.    * <p>
  1382.    * String conversion is a bit of a gray area.  The J2SE implementation of
  1383.    * this function (<code>Double.toString(double)</code> has some problems.  
  1384.    * Often times it does not return the shortest valid String, even though it 
  1385.    * claims to do so, and it has a few
  1386.    * corner cases where it behaves oddly (e.g. 0.001 gets converted to 
  1387.    * the String "0.0010").
  1388.    * <p>
  1389.    * The implementation in MicroDouble uses a much simpler table-based 
  1390.    * algorithm.  It frequently returns slightly different results than 
  1391.    * <code>Double.toString(double)</code>.  Sometimes the results are better,
  1392.    * and sometimes worse.  Ususally the difference is confined to the last
  1393.    * character, which may be different or missing in one of the results.
  1394.    */
  1395.   public static String toString(long d) {
  1396.     return toString(d, 100);
  1397.   }
  1398.   
  1399.   /**
  1400.    * Returns a string representation of the double argument, rounded so that
  1401.    * the returned <code>String</code> is no longer than
  1402.    * <code>maxStringLength</code> characters (or 9 characters, if 
  1403.    * <code>maxStringLength</code> is less than 9).  
  1404.    *
  1405.    * @param      d   the <code>double</code> to be converted.
  1406.    * @param      maxStringLength the maximum length of the returned string 
  1407.    * @return     a string representation of the argument.
  1408.    *
  1409.    * @see #toString(long)
  1410.    */
  1411.   public static String toString(long d, int maxStringLength) {
  1412.     if (isNaN(d)) {
  1413.       return "NaN";
  1414.     }
  1415.     boolean n = unpackSign(d);
  1416.     if (isZero(d)) {
  1417.       return (n ? "-0.0" : "0.0");
  1418.     } else if (isInfinite(d)) {
  1419.       return (n ? "-Infinity" : "Infinity");
  1420.     }
  1421.     if (maxStringLength < 9) {
  1422.       maxStringLength = 9;
  1423.     }
  1424.     // convert from base 2 to base 10
  1425.     int base2x = unpackExponent(d);
  1426.     long base2m = unpackMantissa(d);
  1427.     int idx = base2x + 1075;
  1428.     int dx = idx % 11;
  1429.     base2m <<= dx;
  1430.     idx /= 11;
  1431.     int base10x = pow2x[idx];
  1432.     while (base2m <= 0xcccccccccccccccL) {
  1433.       base2m = (base2m << 3) + (base2m << 1); // base2m *= 10;
  1434.       base10x--;
  1435.     }
  1436.     long base10m = dpMul(base2m, pow2m[idx]);
  1437.     boolean roundedUp = false;
  1438.     while (true) {
  1439.       int r = (int) (base10m % 10);
  1440.       long mt = base10m / 10;
  1441.       int xt = base10x + 1;
  1442.       if (r != 0) {
  1443.         boolean rut;
  1444.         if ((r > 5) || ((r == 5) && (! roundedUp))) {
  1445.           rut = true;
  1446.           mt++;
  1447.         } else {
  1448.           rut = false;
  1449.         }
  1450.         long dt = decToDouble(n, xt, mt);
  1451.         if (dt != d) {
  1452.           if (rut) {
  1453.             mt--;
  1454.           } else {
  1455.             mt++;
  1456.           }
  1457.           rut ^= true;
  1458.           dt = decToDouble(n, xt, mt);
  1459.           if (dt != d) {
  1460.             break;
  1461.           }
  1462.         }
  1463.         roundedUp = rut;
  1464.       }
  1465.       base10m = mt;
  1466.       base10x = xt;
  1467.     }
  1468.     
  1469.     while (true) {
  1470.       String s = toString(n, base10x, base10m);
  1471.       if (s.length() <= maxStringLength) {
  1472.         return s;
  1473.       }
  1474.       int r = (int) (base10m % 10);
  1475.       base10m /= 10;
  1476.       base10x++;
  1477.       if ((r > 5) || ((r == 5) && (! roundedUp))) {
  1478.         roundedUp = true;
  1479.         base10m++;
  1480.       } else {
  1481.         roundedUp = false;
  1482.       }      
  1483.       while ((base10m % 10) == 0) {
  1484.         base10m /= 10;
  1485.         base10x++;
  1486.       }
  1487.     }
  1488.   }
  1489.   
  1490.   private static String toString(boolean negative, int base10x, long base10m) {
  1491.     StringBuffer sb = new StringBuffer(26);
  1492.     if (negative) {
  1493.       sb.append('-');
  1494.     }
  1495.     String s = Long.toString(base10m);
  1496.     base10x += s.length() - 1;
  1497.     boolean scientific = ((base10x < -3) || (base10x >= 7));
  1498.     int dp; // index of decimal point in final string
  1499.     if (scientific) {
  1500.       dp = 1;
  1501.     } else {
  1502.       dp = base10x + 1;
  1503.       if (dp < 1) {
  1504.         sb.append('0');
  1505.       }
  1506.     }
  1507.     for (int i=0; i<dp; i++) {
  1508.       if (i < s.length()) {
  1509.         sb.append(s.charAt(i));
  1510.       } else {
  1511.         sb.append('0');
  1512.       }
  1513.     }
  1514.     sb.append('.');
  1515.     if (dp >= s.length()) {
  1516.       sb.append('0');
  1517.     } else {
  1518.       for (int i=dp; i<s.length(); i++) {
  1519.         if (i < 0) {
  1520.           sb.append('0');
  1521.         } else {
  1522.           sb.append(s.charAt(i));
  1523.         }
  1524.       }
  1525.     }
  1526.     if (scientific) {
  1527.       sb.append('E');
  1528.       sb.append(Integer.toString(base10x));
  1529.     }
  1530.     return sb.toString();
  1531.   }
  1532.   private static final long ONE_EIGHTY =           0x4066800000000000L;
  1533.   private static final long TWO_HUNDRED =          0x4069000000000000L;
  1534.   
  1535.   /**
  1536.    * Mimics <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html#toDegrees(double)">Math.toDegrees(double)</a>.
  1537.    */
  1538.   public static long toDegrees(long angrad) {
  1539.     return div(mul(angrad, ONE_EIGHTY), PI);
  1540.   }
  1541.   
  1542.   /**
  1543.    * Mimics <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html#toRadians(double)">Math.toRadians(double)</a>.
  1544.    */
  1545.   public static long toRadians(long angdeg) {
  1546.     return mul(div(angdeg, ONE_EIGHTY), PI);
  1547.   }
  1548.   public static long toGradians(long angrad) {
  1549.     return div(mul(angrad, TWO_HUNDRED), PI);
  1550.   }
  1551.   public static long gradiansToRadians(long anggrad) {
  1552.     return mul(div(anggrad, TWO_HUNDRED), PI);
  1553.   }
  1554.   
  1555.   /////////////////////////////////////////////////////////////////////////////
  1556.   // Elementary functions.  Most are ported directly from fdlibm.
  1557.   /////////////////////////////////////////////////////////////////////////////
  1558.   private static long set(int newHiPart, int newLowPart) {
  1559.     return ((((long) newHiPart) << 32) | newLowPart);
  1560.   }
  1561.   private static long setLO(long d, int newLowPart) {
  1562.     return ((d & 0xFFFFFFFF00000000L) | newLowPart);
  1563.   }
  1564.   private static long setHI(long d, int newHiPart) {
  1565.     return ((d & 0x00000000FFFFFFFFL) | (((long) newHiPart) << 32));
  1566.   }
  1567.   private static int getHI(long d) {
  1568.     return ((int) (d >> 32));
  1569.   }
  1570.   
  1571.   private static int getLO(long d) {
  1572.     return ((int) d);
  1573.   }
  1574.   private static int ilogb(long d) {
  1575.     if (isZero(d)) {
  1576.       return 0x80000001;
  1577.     } else if (isNaN(d) || (isInfinite(d))) {
  1578.       return 0x7fffffff;
  1579.     }
  1580.     int x = (((int) (d >> 52)) & 0x7ff);
  1581.     if (x == 0) {
  1582.       long m = (d & FRACTION_MASK);
  1583.       while (m < IMPLIED_ONE) {
  1584.         m <<= 1;
  1585.         x--;
  1586.       }
  1587.     }
  1588.     return x - 1023;
  1589.   }
  1590.   
  1591.   /**
  1592.    * @return the magnitude of x with the sign of y
  1593.    */
  1594.   private static long copySign(long x, long y) {
  1595.     return (x & 0x7fffffffffffffffL) | (y & 0x8000000000000000L);
  1596.   }
  1597.   /** 
  1598.    * Returns the value of the first argument, multiplied by 2 raised to the
  1599.    * power of the second argument.  Note that the second argument is really
  1600.    * an <code>int</code>, not a <code>float</code> or <code>double</code>.
  1601.    *
  1602.    * @param d   a <code>double</code> value.
  1603.    * @param n   an <code>int</code> value.
  1604.    * @return  the value <code>d * 2<sup>n</sup></code>.
  1605.    */
  1606.   public static long scalbn(long d, int n) {
  1607.     if (isNaN(d)) {
  1608.       return NaN;
  1609.     } else if ((n == 0) || isInfinite(d) || isZero(d)) {
  1610.       return d;
  1611.     } else if (n >= 2098) {
  1612.       return copySign(POSITIVE_INFINITY, d);
  1613.     } else if (n <= -2099) {
  1614.       return copySign(ZERO, d);
  1615.     }
  1616.     int x = ((int) (d >> 52) & 0x7ff);
  1617.     int x2 = x + n;
  1618.     if ((x == 0) || (x2 <= 0)) { // argument and/or return value are subnormal 
  1619.       return pack(unpackSign(d), x2 - 1075, unpackMantissa(d));
  1620.     } else if (x2 >= 0x7ff) { // overflow
  1621.       return copySign(POSITIVE_INFINITY, d);
  1622.     }
  1623.     return ((d & 0x800fffffffffffffL) | (((long) x2) << 52));
  1624.   }
  1625.   /**
  1626.    * Mimics <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html#IEEEremainder(double, double)">Math.IEEEremainder(double, double)</a>.
  1627.    */
  1628.   public static long IEEEremainder(long d1, long d2) {
  1629.     if (isNaN(d1) || isNaN(d2) || isInfinite(d1) || isZero(d2)) {
  1630.       return NaN;
  1631.     } else if (isZero(d1) || isInfinite(d2)) {
  1632.       return d1;
  1633.     }
  1634.     int hx = getHI(d1); // high word of x 
  1635.     int lx = getLO(d1); // low  word of x 
  1636.     int hp = getHI(d2); // high word of p 
  1637.     int lp = getLO(d2); // low  word of p 
  1638.     boolean negative = unpackSign(d1);
  1639.     hp &= 0x7fffffff;
  1640.     hx &= 0x7fffffff;
  1641.     if (hp<=0x7fdfffff) d1 = mod(d1,scalbn(d2, 1)); // now x < 2p 
  1642.     if (((hx-hp)|(lx-lp))==0) return ZERO; //zero*x;
  1643.     d1  = abs(d1);
  1644.     d2  = abs(d2);
  1645.     if (hp<0x00200000) {
  1646.       if(gt(scalbn(d1, 1), d2)) {
  1647.         d1 = sub(d1, d2);
  1648.         if (ge(scalbn(d1, 1), d2)) d1 = sub(d1, d2);
  1649.       }
  1650.     } else {
  1651.       long p_half = scalbn(d2, -1);
  1652.       if (gt(d1, p_half)) {
  1653.         d1 = sub(d1, d2);
  1654.         if (ge(d1, p_half)) d1 = sub(d1, d2);
  1655.       }
  1656.     }
  1657.     if (negative) {
  1658.       return negate(d1);
  1659.     }
  1660.     return d1;
  1661.   }
  1662.   /**
  1663.    * Mimics <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html#sqrt(double)">Math.sqrt(double)</a>.
  1664.    */
  1665.   public static long sqrt(long d) {
  1666.     if (isZero(d)) {
  1667.       return d;
  1668.     } else if (unpackSign(d) || isNaN(d)) {
  1669.       return NaN;
  1670.     } else if (d == POSITIVE_INFINITY) {
  1671.       return d;
  1672.     }
  1673.     // f is positive, nonzero, and finite
  1674.     // unpack
  1675.     int x = unpackExponent(d);
  1676.     long m = unpackMantissa(d);
  1677.     // normalize 
  1678.     while (m < IMPLIED_ONE) {
  1679.       m <<= 1;
  1680.       x--;
  1681.     }
  1682.     // make exponent even
  1683.     if ((x & 1) != 0) {
  1684.       m <<= 1;
  1685.     }
  1686.     // compute final exponent
  1687.     x = (x >> 1) - 26;
  1688.     
  1689.     // generate sqrt(x) bit by bit
  1690.     m <<= 1;
  1691.     long q = 0L; // q = sqrt(x)
  1692.     long s = 0L;
  1693.     long r = 0x0020000000000000L;
  1694.     while (r != 0) {
  1695.       long t = s + r;
  1696.       if (t < m) {
  1697.         s = t + r;
  1698.         m -= t;
  1699.         q |= r;
  1700.       }
  1701.       m <<= 1;
  1702.       r >>= 1;
  1703.     }
  1704.     // round half even
  1705.     if (m != 0) {
  1706.       q += q & 1L;
  1707.     }
  1708.     q >>= 1;
  1709.     return (((x + 1075L) << 52) | (q & FRACTION_MASK));
  1710.   }
  1711.   
  1712.   private static final long EXP_UNDERFLOW = 0xc0874910d52d3051L; // -745.13321910194110842
  1713.   private static final long EXP_OVERFLOW  = 0x40862e42fefa39efL; // 709.782712893383973096
  1714.   private static final long LN2_HI        = 0x3fe62e42fee00000L;
  1715.   private static final long LN2_LO        = 0x3dea39ef35793c76L; //  1.90821492927058770002e-10
  1716.   private static final long INV_LN2       = 0x3ff71547652b82feL; //  1.44269504088896338700e+00
  1717.   private static final long P1            = 0x3fc555555555553eL; //  1.66666666666666019037e-01
  1718.   private static final long P2            = 0xbf66c16c16bebd93L; // -2.77777777770155933842e-03
  1719.   private static final long P3            = 0x3f11566aaf25de2cL; //  6.61375632143793436117e-05
  1720.   private static final long P4            = 0xbebbbd41c5d26bf1L; // -1.65339022054652515390e-06
  1721.   private static final long P5            = 0x3e66376972bea4d0L; //  4.13813679705723846039e-08
  1722.   /**
  1723.    * Mimics <a href="http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Math.html#exp(double)">Math.exp(double)</a>.
  1724.    */
  1725.   public static long exp(long d) {
  1726.     long x = d;
  1727.     if (isNaN(x)) {
  1728.       return NaN;
  1729.     } else if (isZero(x)) {
  1730.       return ONE;
  1731.     } else if (le(x, EXP_UNDERFLOW)) {
  1732.       return ZERO;
  1733.     } else if (ge(x, EXP_OVERFLOW)) {
  1734.       return POSITIVE_INFINITY;
  1735.     }
  1736.     // argument reduction
  1737.     long hi=0, lo=0;
  1738.     int k=0;
  1739.     int hx = getHI(x) & 0x7fffffff;
  1740.     if (hx > 0x3fd62e42) { // if |x| > 0.5 ln2
  1741.       if (hx < 0x3ff0a2b2) { // and |x| < 1.5 ln2
  1742.         if (unpackSign(x)) {
  1743.           hi = add(x, LN2_HI);
  1744.           lo = LN2_LO | SIGN_MASK;
  1745.           k = -1;
  1746.         } else {
  1747.           hi = sub(x, LN2_HI);
  1748.           lo = LN2_LO;
  1749.           k = 1;
  1750.         }
  1751.       } else {
  1752.         long t = rint(mul(INV_LN2, x));
  1753.         k = intValue(t);
  1754.         hi = sub(x, mul(t, LN2_HI));
  1755.         lo = mul(t, LN2_LO);
  1756.       }
  1757.       x = sub(hi, lo);
  1758.     } else if (hx < 0x3e300000) { // when |x| < 2**-28
  1759.       return add(x, ONE);
  1760.     } else {
  1761.       k = 0;
  1762.     }
  1763.     long t  = mul(x, x);
  1764.     long c = sub(x, mul(t, add(P1, mul(t, add(P2, mul(t, 
  1765.             add(P3, mul(t, add(P4, mul(t, P5))))))))));
  1766.     if (k == 0) {
  1767.       return sub(ONE, sub(div(mul(x, c), 
  1768.               sub(c, TWO)), x));
  1769.     } 
  1770.     x = sub(ONE, sub(sub(lo, div(mul(x, c), 
  1771.             sub(TWO, c))), hi));
  1772.     return scalbn(x, k);
  1773.   }
  1774.   // scaled coefficients related to expm1 
  1775.   private static final long Q1 = 0xBFA11111111110F4L; // -3.33333333333331316428e-02
  1776.   private static final long Q2 = 0x3F5A01A019FE5585L; // 1.58730158725481460165e-03
  1777.   private static final long Q3 = 0xBF14CE199EAADBB7L; // -7.93650757867487942473e-05
  1778.   private static final long Q4 = 0x3ED0CFCA86E65239L; // 4.00821782732936239552e-06
  1779.   private static final long Q5 = 0xBE8AFDB76E09C32DL; // -2.01099218183624371326e-07
  1780.   /**
  1781.    * Returns Euler's number <i>e</i> raised to the power of a
  1782.    * <code>double</code> value, less 1, computed in a way that is accurate
  1783.    * even when the value of d is close to zero.
  1784.    *
  1785.    * @param   d   the exponent to raise <i>e</i> to.
  1786.    * @return  the value <i>e</i><sup><code>d</code></sup><code> - 1</code>, 
  1787.    *          where <i>e</i> is the base of the natural logarithms.
  1788.    * @see #exp(long)
  1789.    * @see #log1p(long)
  1790.    */
  1791.   public static long expm1(long d) {
  1792.     int hx = getHI(d); // high word of x
  1793.     int xsb = hx & 0x80000000; // sign bit of x
  1794.     long y;
  1795.     if (xsb==0) y=d; else y= -d; // y = |x| 
  1796.     hx &= 0x7fffffff; // high word of |x| 
  1797.     // filter out huge and non-finite argument
  1798.     if(hx >= 0x4043687A) { // if |x|>=56*ln2 
  1799.       if(hx >= 0x40862E42) { // if |x|>=709.78... 
  1800.         if(hx>=0x7ff00000) {
  1801.           if(((hx&0xfffff)|getLO(d))!=0) 
  1802.                return NaN;
  1803.           else return (xsb==0)? d : NEGATIVE_ONE; // exp(+-inf)={inf,-1}
  1804.         }
  1805.         if(d > 0x40862E42FEFA39EFL) return POSITIVE_INFINITY; // 7.09782712893383973096e+02 
  1806.       }
  1807.       if(xsb!=0) { // x < -56*ln2, return -1.0 with inexact 
  1808.         return NEGATIVE_ONE;
  1809.       }
  1810.     }
  1811.     // argument reduction
  1812.     long hi, lo, c;
  1813.     int k;
  1814.     if(hx > 0x3fd62e42) { //  if  |x| > 0.5 ln2 
  1815.       if(hx < 0x3FF0A2B2) { // and |x| < 1.5 ln2 
  1816.         if(xsb==0) {
  1817.           hi = sub(d, LN2_HI);
  1818.           lo = LN2_LO;
  1819.           k = 1;
  1820.         } else {
  1821.           hi = add(d, LN2_HI);