emul/mini/src/main/java/java/lang/Double.java
author Jaroslav Tulach <jaroslav.tulach@apidesign.org>
Sat, 26 Jan 2013 08:47:05 +0100
changeset 592 5e13b1ac2886
parent 497 910c043eac22
child 752 cc3871bdd83c
permissions -rw-r--r--
In order to support fields of the same name in subclasses we are now prefixing them with name of the class that defines them. To provide convenient way to access them from generated bytecode and also directly from JavaScript, there is a getter/setter function for each field. It starts with _ followed by the field name. If called with a parameter, it sets the field, with a parameter it just returns it.
     1 /*
     2  * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.  Oracle designates this
     8  * particular file as subject to the "Classpath" exception as provided
     9  * by Oracle in the LICENSE file that accompanied this code.
    10  *
    11  * This code is distributed in the hope that it will be useful, but WITHOUT
    12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    14  * version 2 for more details (a copy is included in the LICENSE file that
    15  * accompanied this code).
    16  *
    17  * You should have received a copy of the GNU General Public License version
    18  * 2 along with this work; if not, write to the Free Software Foundation,
    19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    20  *
    21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    22  * or visit www.oracle.com if you need additional information or have any
    23  * questions.
    24  */
    25 
    26 package java.lang;
    27 
    28 import org.apidesign.bck2brwsr.core.JavaScriptBody;
    29 
    30 /**
    31  * The {@code Double} class wraps a value of the primitive type
    32  * {@code double} in an object. An object of type
    33  * {@code Double} contains a single field whose type is
    34  * {@code double}.
    35  *
    36  * <p>In addition, this class provides several methods for converting a
    37  * {@code double} to a {@code String} and a
    38  * {@code String} to a {@code double}, as well as other
    39  * constants and methods useful when dealing with a
    40  * {@code double}.
    41  *
    42  * @author  Lee Boynton
    43  * @author  Arthur van Hoff
    44  * @author  Joseph D. Darcy
    45  * @since JDK1.0
    46  */
    47 public final class Double extends Number implements Comparable<Double> {
    48     /**
    49      * A constant holding the positive infinity of type
    50      * {@code double}. It is equal to the value returned by
    51      * {@code Double.longBitsToDouble(0x7ff0000000000000L)}.
    52      */
    53     public static final double POSITIVE_INFINITY = 1.0 / 0.0;
    54 
    55     /**
    56      * A constant holding the negative infinity of type
    57      * {@code double}. It is equal to the value returned by
    58      * {@code Double.longBitsToDouble(0xfff0000000000000L)}.
    59      */
    60     public static final double NEGATIVE_INFINITY = -1.0 / 0.0;
    61 
    62     /**
    63      * A constant holding a Not-a-Number (NaN) value of type
    64      * {@code double}. It is equivalent to the value returned by
    65      * {@code Double.longBitsToDouble(0x7ff8000000000000L)}.
    66      */
    67     public static final double NaN = 0.0d / 0.0;
    68 
    69     /**
    70      * A constant holding the largest positive finite value of type
    71      * {@code double},
    72      * (2-2<sup>-52</sup>)&middot;2<sup>1023</sup>.  It is equal to
    73      * the hexadecimal floating-point literal
    74      * {@code 0x1.fffffffffffffP+1023} and also equal to
    75      * {@code Double.longBitsToDouble(0x7fefffffffffffffL)}.
    76      */
    77     public static final double MAX_VALUE = 0x1.fffffffffffffP+1023; // 1.7976931348623157e+308
    78 
    79     /**
    80      * A constant holding the smallest positive normal value of type
    81      * {@code double}, 2<sup>-1022</sup>.  It is equal to the
    82      * hexadecimal floating-point literal {@code 0x1.0p-1022} and also
    83      * equal to {@code Double.longBitsToDouble(0x0010000000000000L)}.
    84      *
    85      * @since 1.6
    86      */
    87     public static final double MIN_NORMAL = 0x1.0p-1022; // 2.2250738585072014E-308
    88 
    89     /**
    90      * A constant holding the smallest positive nonzero value of type
    91      * {@code double}, 2<sup>-1074</sup>. It is equal to the
    92      * hexadecimal floating-point literal
    93      * {@code 0x0.0000000000001P-1022} and also equal to
    94      * {@code Double.longBitsToDouble(0x1L)}.
    95      */
    96     public static final double MIN_VALUE = 0x0.0000000000001P-1022; // 4.9e-324
    97 
    98     /**
    99      * Maximum exponent a finite {@code double} variable may have.
   100      * It is equal to the value returned by
   101      * {@code Math.getExponent(Double.MAX_VALUE)}.
   102      *
   103      * @since 1.6
   104      */
   105     public static final int MAX_EXPONENT = 1023;
   106 
   107     /**
   108      * Minimum exponent a normalized {@code double} variable may
   109      * have.  It is equal to the value returned by
   110      * {@code Math.getExponent(Double.MIN_NORMAL)}.
   111      *
   112      * @since 1.6
   113      */
   114     public static final int MIN_EXPONENT = -1022;
   115 
   116     /**
   117      * The number of bits used to represent a {@code double} value.
   118      *
   119      * @since 1.5
   120      */
   121     public static final int SIZE = 64;
   122 
   123     /**
   124      * The {@code Class} instance representing the primitive type
   125      * {@code double}.
   126      *
   127      * @since JDK1.1
   128      */
   129     public static final Class<Double>   TYPE = (Class<Double>) Class.getPrimitiveClass("double");
   130 
   131     /**
   132      * Returns a string representation of the {@code double}
   133      * argument. All characters mentioned below are ASCII characters.
   134      * <ul>
   135      * <li>If the argument is NaN, the result is the string
   136      *     "{@code NaN}".
   137      * <li>Otherwise, the result is a string that represents the sign and
   138      * magnitude (absolute value) of the argument. If the sign is negative,
   139      * the first character of the result is '{@code -}'
   140      * (<code>'&#92;u002D'</code>); if the sign is positive, no sign character
   141      * appears in the result. As for the magnitude <i>m</i>:
   142      * <ul>
   143      * <li>If <i>m</i> is infinity, it is represented by the characters
   144      * {@code "Infinity"}; thus, positive infinity produces the result
   145      * {@code "Infinity"} and negative infinity produces the result
   146      * {@code "-Infinity"}.
   147      *
   148      * <li>If <i>m</i> is zero, it is represented by the characters
   149      * {@code "0.0"}; thus, negative zero produces the result
   150      * {@code "-0.0"} and positive zero produces the result
   151      * {@code "0.0"}.
   152      *
   153      * <li>If <i>m</i> is greater than or equal to 10<sup>-3</sup> but less
   154      * than 10<sup>7</sup>, then it is represented as the integer part of
   155      * <i>m</i>, in decimal form with no leading zeroes, followed by
   156      * '{@code .}' (<code>'&#92;u002E'</code>), followed by one or
   157      * more decimal digits representing the fractional part of <i>m</i>.
   158      *
   159      * <li>If <i>m</i> is less than 10<sup>-3</sup> or greater than or
   160      * equal to 10<sup>7</sup>, then it is represented in so-called
   161      * "computerized scientific notation." Let <i>n</i> be the unique
   162      * integer such that 10<sup><i>n</i></sup> &le; <i>m</i> {@literal <}
   163      * 10<sup><i>n</i>+1</sup>; then let <i>a</i> be the
   164      * mathematically exact quotient of <i>m</i> and
   165      * 10<sup><i>n</i></sup> so that 1 &le; <i>a</i> {@literal <} 10. The
   166      * magnitude is then represented as the integer part of <i>a</i>,
   167      * as a single decimal digit, followed by '{@code .}'
   168      * (<code>'&#92;u002E'</code>), followed by decimal digits
   169      * representing the fractional part of <i>a</i>, followed by the
   170      * letter '{@code E}' (<code>'&#92;u0045'</code>), followed
   171      * by a representation of <i>n</i> as a decimal integer, as
   172      * produced by the method {@link Integer#toString(int)}.
   173      * </ul>
   174      * </ul>
   175      * How many digits must be printed for the fractional part of
   176      * <i>m</i> or <i>a</i>? There must be at least one digit to represent
   177      * the fractional part, and beyond that as many, but only as many, more
   178      * digits as are needed to uniquely distinguish the argument value from
   179      * adjacent values of type {@code double}. That is, suppose that
   180      * <i>x</i> is the exact mathematical value represented by the decimal
   181      * representation produced by this method for a finite nonzero argument
   182      * <i>d</i>. Then <i>d</i> must be the {@code double} value nearest
   183      * to <i>x</i>; or if two {@code double} values are equally close
   184      * to <i>x</i>, then <i>d</i> must be one of them and the least
   185      * significant bit of the significand of <i>d</i> must be {@code 0}.
   186      *
   187      * <p>To create localized string representations of a floating-point
   188      * value, use subclasses of {@link java.text.NumberFormat}.
   189      *
   190      * @param   d   the {@code double} to be converted.
   191      * @return a string representation of the argument.
   192      */
   193     @JavaScriptBody(args="d", body="var r = d.toString();"
   194         + "if (r.indexOf('.') === -1) r = r + '.0';"
   195         + "return r;")
   196     public static String toString(double d) {
   197         throw new UnsupportedOperationException();
   198     }
   199 
   200     /**
   201      * Returns a hexadecimal string representation of the
   202      * {@code double} argument. All characters mentioned below
   203      * are ASCII characters.
   204      *
   205      * <ul>
   206      * <li>If the argument is NaN, the result is the string
   207      *     "{@code NaN}".
   208      * <li>Otherwise, the result is a string that represents the sign
   209      * and magnitude of the argument. If the sign is negative, the
   210      * first character of the result is '{@code -}'
   211      * (<code>'&#92;u002D'</code>); if the sign is positive, no sign
   212      * character appears in the result. As for the magnitude <i>m</i>:
   213      *
   214      * <ul>
   215      * <li>If <i>m</i> is infinity, it is represented by the string
   216      * {@code "Infinity"}; thus, positive infinity produces the
   217      * result {@code "Infinity"} and negative infinity produces
   218      * the result {@code "-Infinity"}.
   219      *
   220      * <li>If <i>m</i> is zero, it is represented by the string
   221      * {@code "0x0.0p0"}; thus, negative zero produces the result
   222      * {@code "-0x0.0p0"} and positive zero produces the result
   223      * {@code "0x0.0p0"}.
   224      *
   225      * <li>If <i>m</i> is a {@code double} value with a
   226      * normalized representation, substrings are used to represent the
   227      * significand and exponent fields.  The significand is
   228      * represented by the characters {@code "0x1."}
   229      * followed by a lowercase hexadecimal representation of the rest
   230      * of the significand as a fraction.  Trailing zeros in the
   231      * hexadecimal representation are removed unless all the digits
   232      * are zero, in which case a single zero is used. Next, the
   233      * exponent is represented by {@code "p"} followed
   234      * by a decimal string of the unbiased exponent as if produced by
   235      * a call to {@link Integer#toString(int) Integer.toString} on the
   236      * exponent value.
   237      *
   238      * <li>If <i>m</i> is a {@code double} value with a subnormal
   239      * representation, the significand is represented by the
   240      * characters {@code "0x0."} followed by a
   241      * hexadecimal representation of the rest of the significand as a
   242      * fraction.  Trailing zeros in the hexadecimal representation are
   243      * removed. Next, the exponent is represented by
   244      * {@code "p-1022"}.  Note that there must be at
   245      * least one nonzero digit in a subnormal significand.
   246      *
   247      * </ul>
   248      *
   249      * </ul>
   250      *
   251      * <table border>
   252      * <caption><h3>Examples</h3></caption>
   253      * <tr><th>Floating-point Value</th><th>Hexadecimal String</th>
   254      * <tr><td>{@code 1.0}</td> <td>{@code 0x1.0p0}</td>
   255      * <tr><td>{@code -1.0}</td>        <td>{@code -0x1.0p0}</td>
   256      * <tr><td>{@code 2.0}</td> <td>{@code 0x1.0p1}</td>
   257      * <tr><td>{@code 3.0}</td> <td>{@code 0x1.8p1}</td>
   258      * <tr><td>{@code 0.5}</td> <td>{@code 0x1.0p-1}</td>
   259      * <tr><td>{@code 0.25}</td>        <td>{@code 0x1.0p-2}</td>
   260      * <tr><td>{@code Double.MAX_VALUE}</td>
   261      *     <td>{@code 0x1.fffffffffffffp1023}</td>
   262      * <tr><td>{@code Minimum Normal Value}</td>
   263      *     <td>{@code 0x1.0p-1022}</td>
   264      * <tr><td>{@code Maximum Subnormal Value}</td>
   265      *     <td>{@code 0x0.fffffffffffffp-1022}</td>
   266      * <tr><td>{@code Double.MIN_VALUE}</td>
   267      *     <td>{@code 0x0.0000000000001p-1022}</td>
   268      * </table>
   269      * @param   d   the {@code double} to be converted.
   270      * @return a hex string representation of the argument.
   271      * @since 1.5
   272      * @author Joseph D. Darcy
   273      */
   274     public static String toHexString(double d) {
   275         throw new UnsupportedOperationException();
   276 //        /*
   277 //         * Modeled after the "a" conversion specifier in C99, section
   278 //         * 7.19.6.1; however, the output of this method is more
   279 //         * tightly specified.
   280 //         */
   281 //        if (!FpUtils.isFinite(d) )
   282 //            // For infinity and NaN, use the decimal output.
   283 //            return Double.toString(d);
   284 //        else {
   285 //            // Initialized to maximum size of output.
   286 //            StringBuffer answer = new StringBuffer(24);
   287 //
   288 //            if (FpUtils.rawCopySign(1.0, d) == -1.0) // value is negative,
   289 //                answer.append("-");                  // so append sign info
   290 //
   291 //            answer.append("0x");
   292 //
   293 //            d = Math.abs(d);
   294 //
   295 //            if(d == 0.0) {
   296 //                answer.append("0.0p0");
   297 //            }
   298 //            else {
   299 //                boolean subnormal = (d < DoubleConsts.MIN_NORMAL);
   300 //
   301 //                // Isolate significand bits and OR in a high-order bit
   302 //                // so that the string representation has a known
   303 //                // length.
   304 //                long signifBits = (Double.doubleToLongBits(d)
   305 //                                   & DoubleConsts.SIGNIF_BIT_MASK) |
   306 //                    0x1000000000000000L;
   307 //
   308 //                // Subnormal values have a 0 implicit bit; normal
   309 //                // values have a 1 implicit bit.
   310 //                answer.append(subnormal ? "0." : "1.");
   311 //
   312 //                // Isolate the low-order 13 digits of the hex
   313 //                // representation.  If all the digits are zero,
   314 //                // replace with a single 0; otherwise, remove all
   315 //                // trailing zeros.
   316 //                String signif = Long.toHexString(signifBits).substring(3,16);
   317 //                answer.append(signif.equals("0000000000000") ? // 13 zeros
   318 //                              "0":
   319 //                              signif.replaceFirst("0{1,12}$", ""));
   320 //
   321 //                // If the value is subnormal, use the E_min exponent
   322 //                // value for double; otherwise, extract and report d's
   323 //                // exponent (the representation of a subnormal uses
   324 //                // E_min -1).
   325 //                answer.append("p" + (subnormal ?
   326 //                               DoubleConsts.MIN_EXPONENT:
   327 //                               FpUtils.getExponent(d) ));
   328 //            }
   329 //            return answer.toString();
   330 //        }
   331     }
   332 
   333     /**
   334      * Returns a {@code Double} object holding the
   335      * {@code double} value represented by the argument string
   336      * {@code s}.
   337      *
   338      * <p>If {@code s} is {@code null}, then a
   339      * {@code NullPointerException} is thrown.
   340      *
   341      * <p>Leading and trailing whitespace characters in {@code s}
   342      * are ignored.  Whitespace is removed as if by the {@link
   343      * String#trim} method; that is, both ASCII space and control
   344      * characters are removed. The rest of {@code s} should
   345      * constitute a <i>FloatValue</i> as described by the lexical
   346      * syntax rules:
   347      *
   348      * <blockquote>
   349      * <dl>
   350      * <dt><i>FloatValue:</i>
   351      * <dd><i>Sign<sub>opt</sub></i> {@code NaN}
   352      * <dd><i>Sign<sub>opt</sub></i> {@code Infinity}
   353      * <dd><i>Sign<sub>opt</sub> FloatingPointLiteral</i>
   354      * <dd><i>Sign<sub>opt</sub> HexFloatingPointLiteral</i>
   355      * <dd><i>SignedInteger</i>
   356      * </dl>
   357      *
   358      * <p>
   359      *
   360      * <dl>
   361      * <dt><i>HexFloatingPointLiteral</i>:
   362      * <dd> <i>HexSignificand BinaryExponent FloatTypeSuffix<sub>opt</sub></i>
   363      * </dl>
   364      *
   365      * <p>
   366      *
   367      * <dl>
   368      * <dt><i>HexSignificand:</i>
   369      * <dd><i>HexNumeral</i>
   370      * <dd><i>HexNumeral</i> {@code .}
   371      * <dd>{@code 0x} <i>HexDigits<sub>opt</sub>
   372      *     </i>{@code .}<i> HexDigits</i>
   373      * <dd>{@code 0X}<i> HexDigits<sub>opt</sub>
   374      *     </i>{@code .} <i>HexDigits</i>
   375      * </dl>
   376      *
   377      * <p>
   378      *
   379      * <dl>
   380      * <dt><i>BinaryExponent:</i>
   381      * <dd><i>BinaryExponentIndicator SignedInteger</i>
   382      * </dl>
   383      *
   384      * <p>
   385      *
   386      * <dl>
   387      * <dt><i>BinaryExponentIndicator:</i>
   388      * <dd>{@code p}
   389      * <dd>{@code P}
   390      * </dl>
   391      *
   392      * </blockquote>
   393      *
   394      * where <i>Sign</i>, <i>FloatingPointLiteral</i>,
   395      * <i>HexNumeral</i>, <i>HexDigits</i>, <i>SignedInteger</i> and
   396      * <i>FloatTypeSuffix</i> are as defined in the lexical structure
   397      * sections of
   398      * <cite>The Java&trade; Language Specification</cite>,
   399      * except that underscores are not accepted between digits.
   400      * If {@code s} does not have the form of
   401      * a <i>FloatValue</i>, then a {@code NumberFormatException}
   402      * is thrown. Otherwise, {@code s} is regarded as
   403      * representing an exact decimal value in the usual
   404      * "computerized scientific notation" or as an exact
   405      * hexadecimal value; this exact numerical value is then
   406      * conceptually converted to an "infinitely precise"
   407      * binary value that is then rounded to type {@code double}
   408      * by the usual round-to-nearest rule of IEEE 754 floating-point
   409      * arithmetic, which includes preserving the sign of a zero
   410      * value.
   411      *
   412      * Note that the round-to-nearest rule also implies overflow and
   413      * underflow behaviour; if the exact value of {@code s} is large
   414      * enough in magnitude (greater than or equal to ({@link
   415      * #MAX_VALUE} + {@link Math#ulp(double) ulp(MAX_VALUE)}/2),
   416      * rounding to {@code double} will result in an infinity and if the
   417      * exact value of {@code s} is small enough in magnitude (less
   418      * than or equal to {@link #MIN_VALUE}/2), rounding to float will
   419      * result in a zero.
   420      *
   421      * Finally, after rounding a {@code Double} object representing
   422      * this {@code double} value is returned.
   423      *
   424      * <p> To interpret localized string representations of a
   425      * floating-point value, use subclasses of {@link
   426      * java.text.NumberFormat}.
   427      *
   428      * <p>Note that trailing format specifiers, specifiers that
   429      * determine the type of a floating-point literal
   430      * ({@code 1.0f} is a {@code float} value;
   431      * {@code 1.0d} is a {@code double} value), do
   432      * <em>not</em> influence the results of this method.  In other
   433      * words, the numerical value of the input string is converted
   434      * directly to the target floating-point type.  The two-step
   435      * sequence of conversions, string to {@code float} followed
   436      * by {@code float} to {@code double}, is <em>not</em>
   437      * equivalent to converting a string directly to
   438      * {@code double}. For example, the {@code float}
   439      * literal {@code 0.1f} is equal to the {@code double}
   440      * value {@code 0.10000000149011612}; the {@code float}
   441      * literal {@code 0.1f} represents a different numerical
   442      * value than the {@code double} literal
   443      * {@code 0.1}. (The numerical value 0.1 cannot be exactly
   444      * represented in a binary floating-point number.)
   445      *
   446      * <p>To avoid calling this method on an invalid string and having
   447      * a {@code NumberFormatException} be thrown, the regular
   448      * expression below can be used to screen the input string:
   449      *
   450      * <code>
   451      * <pre>
   452      *  final String Digits     = "(\\p{Digit}+)";
   453      *  final String HexDigits  = "(\\p{XDigit}+)";
   454      *  // an exponent is 'e' or 'E' followed by an optionally
   455      *  // signed decimal integer.
   456      *  final String Exp        = "[eE][+-]?"+Digits;
   457      *  final String fpRegex    =
   458      *      ("[\\x00-\\x20]*"+  // Optional leading "whitespace"
   459      *       "[+-]?(" + // Optional sign character
   460      *       "NaN|" +           // "NaN" string
   461      *       "Infinity|" +      // "Infinity" string
   462      *
   463      *       // A decimal floating-point string representing a finite positive
   464      *       // number without a leading sign has at most five basic pieces:
   465      *       // Digits . Digits ExponentPart FloatTypeSuffix
   466      *       //
   467      *       // Since this method allows integer-only strings as input
   468      *       // in addition to strings of floating-point literals, the
   469      *       // two sub-patterns below are simplifications of the grammar
   470      *       // productions from section 3.10.2 of
   471      *       // <cite>The Java&trade; Language Specification</cite>.
   472      *
   473      *       // Digits ._opt Digits_opt ExponentPart_opt FloatTypeSuffix_opt
   474      *       "((("+Digits+"(\\.)?("+Digits+"?)("+Exp+")?)|"+
   475      *
   476      *       // . Digits ExponentPart_opt FloatTypeSuffix_opt
   477      *       "(\\.("+Digits+")("+Exp+")?)|"+
   478      *
   479      *       // Hexadecimal strings
   480      *       "((" +
   481      *        // 0[xX] HexDigits ._opt BinaryExponent FloatTypeSuffix_opt
   482      *        "(0[xX]" + HexDigits + "(\\.)?)|" +
   483      *
   484      *        // 0[xX] HexDigits_opt . HexDigits BinaryExponent FloatTypeSuffix_opt
   485      *        "(0[xX]" + HexDigits + "?(\\.)" + HexDigits + ")" +
   486      *
   487      *        ")[pP][+-]?" + Digits + "))" +
   488      *       "[fFdD]?))" +
   489      *       "[\\x00-\\x20]*");// Optional trailing "whitespace"
   490      *
   491      *  if (Pattern.matches(fpRegex, myString))
   492      *      Double.valueOf(myString); // Will not throw NumberFormatException
   493      *  else {
   494      *      // Perform suitable alternative action
   495      *  }
   496      * </pre>
   497      * </code>
   498      *
   499      * @param      s   the string to be parsed.
   500      * @return     a {@code Double} object holding the value
   501      *             represented by the {@code String} argument.
   502      * @throws     NumberFormatException  if the string does not contain a
   503      *             parsable number.
   504      */
   505     @JavaScriptBody(args="s", body="return parseFloat(s);")
   506     public static Double valueOf(String s) throws NumberFormatException {
   507         throw new UnsupportedOperationException();
   508 //        return new Double(FloatingDecimal.readJavaFormatString(s).doubleValue());
   509     }
   510 
   511     /**
   512      * Returns a {@code Double} instance representing the specified
   513      * {@code double} value.
   514      * If a new {@code Double} instance is not required, this method
   515      * should generally be used in preference to the constructor
   516      * {@link #Double(double)}, as this method is likely to yield
   517      * significantly better space and time performance by caching
   518      * frequently requested values.
   519      *
   520      * @param  d a double value.
   521      * @return a {@code Double} instance representing {@code d}.
   522      * @since  1.5
   523      */
   524     public static Double valueOf(double d) {
   525         return new Double(d);
   526     }
   527 
   528     /**
   529      * Returns a new {@code double} initialized to the value
   530      * represented by the specified {@code String}, as performed
   531      * by the {@code valueOf} method of class
   532      * {@code Double}.
   533      *
   534      * @param  s   the string to be parsed.
   535      * @return the {@code double} value represented by the string
   536      *         argument.
   537      * @throws NullPointerException  if the string is null
   538      * @throws NumberFormatException if the string does not contain
   539      *         a parsable {@code double}.
   540      * @see    java.lang.Double#valueOf(String)
   541      * @since 1.2
   542      */
   543     @JavaScriptBody(args="s", body="return parseFloat(s);")
   544     public static double parseDouble(String s) throws NumberFormatException {
   545         throw new UnsupportedOperationException();
   546 //        return FloatingDecimal.readJavaFormatString(s).doubleValue();
   547     }
   548 
   549     /**
   550      * Returns {@code true} if the specified number is a
   551      * Not-a-Number (NaN) value, {@code false} otherwise.
   552      *
   553      * @param   v   the value to be tested.
   554      * @return  {@code true} if the value of the argument is NaN;
   555      *          {@code false} otherwise.
   556      */
   557     static public boolean isNaN(double v) {
   558         return (v != v);
   559     }
   560 
   561     /**
   562      * Returns {@code true} if the specified number is infinitely
   563      * large in magnitude, {@code false} otherwise.
   564      *
   565      * @param   v   the value to be tested.
   566      * @return  {@code true} if the value of the argument is positive
   567      *          infinity or negative infinity; {@code false} otherwise.
   568      */
   569     static public boolean isInfinite(double v) {
   570         return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY);
   571     }
   572 
   573     /**
   574      * The value of the Double.
   575      *
   576      * @serial
   577      */
   578     private final double value;
   579 
   580     /**
   581      * Constructs a newly allocated {@code Double} object that
   582      * represents the primitive {@code double} argument.
   583      *
   584      * @param   value   the value to be represented by the {@code Double}.
   585      */
   586     public Double(double value) {
   587         this.value = value;
   588     }
   589 
   590     /**
   591      * Constructs a newly allocated {@code Double} object that
   592      * represents the floating-point value of type {@code double}
   593      * represented by the string. The string is converted to a
   594      * {@code double} value as if by the {@code valueOf} method.
   595      *
   596      * @param  s  a string to be converted to a {@code Double}.
   597      * @throws    NumberFormatException  if the string does not contain a
   598      *            parsable number.
   599      * @see       java.lang.Double#valueOf(java.lang.String)
   600      */
   601     public Double(String s) throws NumberFormatException {
   602         // REMIND: this is inefficient
   603         this(valueOf(s).doubleValue());
   604     }
   605 
   606     /**
   607      * Returns {@code true} if this {@code Double} value is
   608      * a Not-a-Number (NaN), {@code false} otherwise.
   609      *
   610      * @return  {@code true} if the value represented by this object is
   611      *          NaN; {@code false} otherwise.
   612      */
   613     public boolean isNaN() {
   614         return isNaN(value);
   615     }
   616 
   617     /**
   618      * Returns {@code true} if this {@code Double} value is
   619      * infinitely large in magnitude, {@code false} otherwise.
   620      *
   621      * @return  {@code true} if the value represented by this object is
   622      *          positive infinity or negative infinity;
   623      *          {@code false} otherwise.
   624      */
   625     public boolean isInfinite() {
   626         return isInfinite(value);
   627     }
   628 
   629     /**
   630      * Returns a string representation of this {@code Double} object.
   631      * The primitive {@code double} value represented by this
   632      * object is converted to a string exactly as if by the method
   633      * {@code toString} of one argument.
   634      *
   635      * @return  a {@code String} representation of this object.
   636      * @see java.lang.Double#toString(double)
   637      */
   638     public String toString() {
   639         return toString(value);
   640     }
   641 
   642     /**
   643      * Returns the value of this {@code Double} as a {@code byte} (by
   644      * casting to a {@code byte}).
   645      *
   646      * @return  the {@code double} value represented by this object
   647      *          converted to type {@code byte}
   648      * @since JDK1.1
   649      */
   650     public byte byteValue() {
   651         return (byte)value;
   652     }
   653 
   654     /**
   655      * Returns the value of this {@code Double} as a
   656      * {@code short} (by casting to a {@code short}).
   657      *
   658      * @return  the {@code double} value represented by this object
   659      *          converted to type {@code short}
   660      * @since JDK1.1
   661      */
   662     public short shortValue() {
   663         return (short)value;
   664     }
   665 
   666     /**
   667      * Returns the value of this {@code Double} as an
   668      * {@code int} (by casting to type {@code int}).
   669      *
   670      * @return  the {@code double} value represented by this object
   671      *          converted to type {@code int}
   672      */
   673     public int intValue() {
   674         return (int)value;
   675     }
   676 
   677     /**
   678      * Returns the value of this {@code Double} as a
   679      * {@code long} (by casting to type {@code long}).
   680      *
   681      * @return  the {@code double} value represented by this object
   682      *          converted to type {@code long}
   683      */
   684     public long longValue() {
   685         return (long)value;
   686     }
   687 
   688     /**
   689      * Returns the {@code float} value of this
   690      * {@code Double} object.
   691      *
   692      * @return  the {@code double} value represented by this object
   693      *          converted to type {@code float}
   694      * @since JDK1.0
   695      */
   696     public float floatValue() {
   697         return (float)value;
   698     }
   699 
   700     /**
   701      * Returns the {@code double} value of this
   702      * {@code Double} object.
   703      *
   704      * @return the {@code double} value represented by this object
   705      */
   706     public double doubleValue() {
   707         return (double)value;
   708     }
   709 
   710     /**
   711      * Returns a hash code for this {@code Double} object. The
   712      * result is the exclusive OR of the two halves of the
   713      * {@code long} integer bit representation, exactly as
   714      * produced by the method {@link #doubleToLongBits(double)}, of
   715      * the primitive {@code double} value represented by this
   716      * {@code Double} object. That is, the hash code is the value
   717      * of the expression:
   718      *
   719      * <blockquote>
   720      *  {@code (int)(v^(v>>>32))}
   721      * </blockquote>
   722      *
   723      * where {@code v} is defined by:
   724      *
   725      * <blockquote>
   726      *  {@code long v = Double.doubleToLongBits(this.doubleValue());}
   727      * </blockquote>
   728      *
   729      * @return  a {@code hash code} value for this object.
   730      */
   731     public int hashCode() {
   732         long bits = doubleToLongBits(value);
   733         return (int)(bits ^ (bits >>> 32));
   734     }
   735 
   736     /**
   737      * Compares this object against the specified object.  The result
   738      * is {@code true} if and only if the argument is not
   739      * {@code null} and is a {@code Double} object that
   740      * represents a {@code double} that has the same value as the
   741      * {@code double} represented by this object. For this
   742      * purpose, two {@code double} values are considered to be
   743      * the same if and only if the method {@link
   744      * #doubleToLongBits(double)} returns the identical
   745      * {@code long} value when applied to each.
   746      *
   747      * <p>Note that in most cases, for two instances of class
   748      * {@code Double}, {@code d1} and {@code d2}, the
   749      * value of {@code d1.equals(d2)} is {@code true} if and
   750      * only if
   751      *
   752      * <blockquote>
   753      *  {@code d1.doubleValue() == d2.doubleValue()}
   754      * </blockquote>
   755      *
   756      * <p>also has the value {@code true}. However, there are two
   757      * exceptions:
   758      * <ul>
   759      * <li>If {@code d1} and {@code d2} both represent
   760      *     {@code Double.NaN}, then the {@code equals} method
   761      *     returns {@code true}, even though
   762      *     {@code Double.NaN==Double.NaN} has the value
   763      *     {@code false}.
   764      * <li>If {@code d1} represents {@code +0.0} while
   765      *     {@code d2} represents {@code -0.0}, or vice versa,
   766      *     the {@code equal} test has the value {@code false},
   767      *     even though {@code +0.0==-0.0} has the value {@code true}.
   768      * </ul>
   769      * This definition allows hash tables to operate properly.
   770      * @param   obj   the object to compare with.
   771      * @return  {@code true} if the objects are the same;
   772      *          {@code false} otherwise.
   773      * @see java.lang.Double#doubleToLongBits(double)
   774      */
   775     public boolean equals(Object obj) {
   776         return (obj instanceof Double)
   777                && (((Double)obj).value) == value;
   778     }
   779 
   780     /**
   781      * Returns a representation of the specified floating-point value
   782      * according to the IEEE 754 floating-point "double
   783      * format" bit layout.
   784      *
   785      * <p>Bit 63 (the bit that is selected by the mask
   786      * {@code 0x8000000000000000L}) represents the sign of the
   787      * floating-point number. Bits
   788      * 62-52 (the bits that are selected by the mask
   789      * {@code 0x7ff0000000000000L}) represent the exponent. Bits 51-0
   790      * (the bits that are selected by the mask
   791      * {@code 0x000fffffffffffffL}) represent the significand
   792      * (sometimes called the mantissa) of the floating-point number.
   793      *
   794      * <p>If the argument is positive infinity, the result is
   795      * {@code 0x7ff0000000000000L}.
   796      *
   797      * <p>If the argument is negative infinity, the result is
   798      * {@code 0xfff0000000000000L}.
   799      *
   800      * <p>If the argument is NaN, the result is
   801      * {@code 0x7ff8000000000000L}.
   802      *
   803      * <p>In all cases, the result is a {@code long} integer that, when
   804      * given to the {@link #longBitsToDouble(long)} method, will produce a
   805      * floating-point value the same as the argument to
   806      * {@code doubleToLongBits} (except all NaN values are
   807      * collapsed to a single "canonical" NaN value).
   808      *
   809      * @param   value   a {@code double} precision floating-point number.
   810      * @return the bits that represent the floating-point number.
   811      */
   812     public static long doubleToLongBits(double value) {
   813         throw new UnsupportedOperationException();
   814 //        long result = doubleToRawLongBits(value);
   815 //        // Check for NaN based on values of bit fields, maximum
   816 //        // exponent and nonzero significand.
   817 //        if ( ((result & DoubleConsts.EXP_BIT_MASK) ==
   818 //              DoubleConsts.EXP_BIT_MASK) &&
   819 //             (result & DoubleConsts.SIGNIF_BIT_MASK) != 0L)
   820 //            result = 0x7ff8000000000000L;
   821 //        return result;
   822     }
   823 
   824     /**
   825      * Returns a representation of the specified floating-point value
   826      * according to the IEEE 754 floating-point "double
   827      * format" bit layout, preserving Not-a-Number (NaN) values.
   828      *
   829      * <p>Bit 63 (the bit that is selected by the mask
   830      * {@code 0x8000000000000000L}) represents the sign of the
   831      * floating-point number. Bits
   832      * 62-52 (the bits that are selected by the mask
   833      * {@code 0x7ff0000000000000L}) represent the exponent. Bits 51-0
   834      * (the bits that are selected by the mask
   835      * {@code 0x000fffffffffffffL}) represent the significand
   836      * (sometimes called the mantissa) of the floating-point number.
   837      *
   838      * <p>If the argument is positive infinity, the result is
   839      * {@code 0x7ff0000000000000L}.
   840      *
   841      * <p>If the argument is negative infinity, the result is
   842      * {@code 0xfff0000000000000L}.
   843      *
   844      * <p>If the argument is NaN, the result is the {@code long}
   845      * integer representing the actual NaN value.  Unlike the
   846      * {@code doubleToLongBits} method,
   847      * {@code doubleToRawLongBits} does not collapse all the bit
   848      * patterns encoding a NaN to a single "canonical" NaN
   849      * value.
   850      *
   851      * <p>In all cases, the result is a {@code long} integer that,
   852      * when given to the {@link #longBitsToDouble(long)} method, will
   853      * produce a floating-point value the same as the argument to
   854      * {@code doubleToRawLongBits}.
   855      *
   856      * @param   value   a {@code double} precision floating-point number.
   857      * @return the bits that represent the floating-point number.
   858      * @since 1.3
   859      */
   860     public static native long doubleToRawLongBits(double value);
   861 
   862     /**
   863      * Returns the {@code double} value corresponding to a given
   864      * bit representation.
   865      * The argument is considered to be a representation of a
   866      * floating-point value according to the IEEE 754 floating-point
   867      * "double format" bit layout.
   868      *
   869      * <p>If the argument is {@code 0x7ff0000000000000L}, the result
   870      * is positive infinity.
   871      *
   872      * <p>If the argument is {@code 0xfff0000000000000L}, the result
   873      * is negative infinity.
   874      *
   875      * <p>If the argument is any value in the range
   876      * {@code 0x7ff0000000000001L} through
   877      * {@code 0x7fffffffffffffffL} or in the range
   878      * {@code 0xfff0000000000001L} through
   879      * {@code 0xffffffffffffffffL}, the result is a NaN.  No IEEE
   880      * 754 floating-point operation provided by Java can distinguish
   881      * between two NaN values of the same type with different bit
   882      * patterns.  Distinct values of NaN are only distinguishable by
   883      * use of the {@code Double.doubleToRawLongBits} method.
   884      *
   885      * <p>In all other cases, let <i>s</i>, <i>e</i>, and <i>m</i> be three
   886      * values that can be computed from the argument:
   887      *
   888      * <blockquote><pre>
   889      * int s = ((bits &gt;&gt; 63) == 0) ? 1 : -1;
   890      * int e = (int)((bits &gt;&gt; 52) & 0x7ffL);
   891      * long m = (e == 0) ?
   892      *                 (bits & 0xfffffffffffffL) &lt;&lt; 1 :
   893      *                 (bits & 0xfffffffffffffL) | 0x10000000000000L;
   894      * </pre></blockquote>
   895      *
   896      * Then the floating-point result equals the value of the mathematical
   897      * expression <i>s</i>&middot;<i>m</i>&middot;2<sup><i>e</i>-1075</sup>.
   898      *
   899      * <p>Note that this method may not be able to return a
   900      * {@code double} NaN with exactly same bit pattern as the
   901      * {@code long} argument.  IEEE 754 distinguishes between two
   902      * kinds of NaNs, quiet NaNs and <i>signaling NaNs</i>.  The
   903      * differences between the two kinds of NaN are generally not
   904      * visible in Java.  Arithmetic operations on signaling NaNs turn
   905      * them into quiet NaNs with a different, but often similar, bit
   906      * pattern.  However, on some processors merely copying a
   907      * signaling NaN also performs that conversion.  In particular,
   908      * copying a signaling NaN to return it to the calling method
   909      * may perform this conversion.  So {@code longBitsToDouble}
   910      * may not be able to return a {@code double} with a
   911      * signaling NaN bit pattern.  Consequently, for some
   912      * {@code long} values,
   913      * {@code doubleToRawLongBits(longBitsToDouble(start))} may
   914      * <i>not</i> equal {@code start}.  Moreover, which
   915      * particular bit patterns represent signaling NaNs is platform
   916      * dependent; although all NaN bit patterns, quiet or signaling,
   917      * must be in the NaN range identified above.
   918      *
   919      * @param   bits   any {@code long} integer.
   920      * @return  the {@code double} floating-point value with the same
   921      *          bit pattern.
   922      */
   923     public static native double longBitsToDouble(long bits);
   924 
   925     /**
   926      * Compares two {@code Double} objects numerically.  There
   927      * are two ways in which comparisons performed by this method
   928      * differ from those performed by the Java language numerical
   929      * comparison operators ({@code <, <=, ==, >=, >})
   930      * when applied to primitive {@code double} values:
   931      * <ul><li>
   932      *          {@code Double.NaN} is considered by this method
   933      *          to be equal to itself and greater than all other
   934      *          {@code double} values (including
   935      *          {@code Double.POSITIVE_INFINITY}).
   936      * <li>
   937      *          {@code 0.0d} is considered by this method to be greater
   938      *          than {@code -0.0d}.
   939      * </ul>
   940      * This ensures that the <i>natural ordering</i> of
   941      * {@code Double} objects imposed by this method is <i>consistent
   942      * with equals</i>.
   943      *
   944      * @param   anotherDouble   the {@code Double} to be compared.
   945      * @return  the value {@code 0} if {@code anotherDouble} is
   946      *          numerically equal to this {@code Double}; a value
   947      *          less than {@code 0} if this {@code Double}
   948      *          is numerically less than {@code anotherDouble};
   949      *          and a value greater than {@code 0} if this
   950      *          {@code Double} is numerically greater than
   951      *          {@code anotherDouble}.
   952      *
   953      * @since   1.2
   954      */
   955     public int compareTo(Double anotherDouble) {
   956         return Double.compare(value, anotherDouble.value);
   957     }
   958 
   959     /**
   960      * Compares the two specified {@code double} values. The sign
   961      * of the integer value returned is the same as that of the
   962      * integer that would be returned by the call:
   963      * <pre>
   964      *    new Double(d1).compareTo(new Double(d2))
   965      * </pre>
   966      *
   967      * @param   d1        the first {@code double} to compare
   968      * @param   d2        the second {@code double} to compare
   969      * @return  the value {@code 0} if {@code d1} is
   970      *          numerically equal to {@code d2}; a value less than
   971      *          {@code 0} if {@code d1} is numerically less than
   972      *          {@code d2}; and a value greater than {@code 0}
   973      *          if {@code d1} is numerically greater than
   974      *          {@code d2}.
   975      * @since 1.4
   976      */
   977     public static int compare(double d1, double d2) {
   978         if (d1 < d2)
   979             return -1;           // Neither val is NaN, thisVal is smaller
   980         if (d1 > d2)
   981             return 1;            // Neither val is NaN, thisVal is larger
   982 
   983         // Cannot use doubleToRawLongBits because of possibility of NaNs.
   984         long thisBits    = Double.doubleToLongBits(d1);
   985         long anotherBits = Double.doubleToLongBits(d2);
   986 
   987         return (thisBits == anotherBits ?  0 : // Values are equal
   988                 (thisBits < anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN)
   989                  1));                          // (0.0, -0.0) or (NaN, !NaN)
   990     }
   991 
   992     /** use serialVersionUID from JDK 1.0.2 for interoperability */
   993     private static final long serialVersionUID = -9172774392245257468L;
   994 }