aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/lang/Double.java
blob: 850aa5ad979e0c166b8f4a57fa1cc262e9ba9e1c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/* Copyright (C) 1998, 1999  Cygnus Solutions

   This file is part of libgcj.

This software is copyrighted work licensed under the terms of the
Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
details.  */
 
package java.lang;

/**
 * @author Andrew Haley <aph@cygnus.com>
 * @date September 25, 1998.  
 */
/* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3
 * "The Java Language Specification", ISBN 0-201-63451-1
 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com.
 * Status:  Believed complete and correct.
 */

public final class Double extends Number
{
  public static final double MIN_VALUE = 5e-324;
  public static final double MAX_VALUE = 1.7976931348623157e+308;
  public static final double NEGATIVE_INFINITY = -1.0d/0.0d;
  public static final double POSITIVE_INFINITY = 1.0d/0.0d;
  public static final double NaN = 0.0d/0.0d;

  // This initialization is seemingly circular, but it is accepted
  // by javac, and is handled specially by gcc.
  public static final Class TYPE = double.class;

  private double value;

  private native static double doubleValueOf (String s) 
       throws NumberFormatException;  

  public Double (double v)
  {
    value = v;
  }

  public Double (String s) throws NumberFormatException
  {
    value = valueOf (s).doubleValue ();
  }

  public String toString ()
  {
    return toString (value);
  }

  public boolean equals (Object obj)
  {
    if (obj == null)
      return false;

    if (!(obj instanceof Double))
      return false;

    Double d = (Double) obj;

    return doubleToLongBits (value) == doubleToLongBits (d.doubleValue ());
  }

  public int hashCode ()
  {
    long v = doubleToLongBits (value);
    return (int) (v ^ (v >>> 32));
  }

  public int intValue ()
  {
    return (int) value;
  }

  public long longValue ()
  {
    return (long) value;
  }

  public float floatValue ()
  {
    return (float) value;
  }

  public double doubleValue ()
  {
    return value;
  }

  public byte byteValue ()
  {
    return (byte) value;
  }

  public short shortValue ()
  {
    return (short) value;
  }

  native static String toString (double v, boolean isFloat);

  public static String toString (double v)
  {
    return toString (v, false);
  }

  public static Double valueOf (String s) throws NullPointerException, 
    NumberFormatException
  {
    if (s == null)
      throw new NullPointerException ();

    return new Double (doubleValueOf (s));
  }

  public boolean isNaN ()
  {
    return isNaN (value);
  }

  public static boolean isNaN (double v)
  {
    long bits = doubleToLongBits (v);
    long e = bits & 0x7ff0000000000000L;
    long f = bits & 0x000fffffffffffffL;

    return e == 0x7ff0000000000000L && f != 0L;
  }

  public boolean isInfinite ()
  {
    return isInfinite (value);
  }

  public static boolean isInfinite (double v)
  {
    long bits = doubleToLongBits (v);
    long f = bits & 0x7fffffffffffffffL;

    return f == 0x7ff0000000000000L;
  }

  public static native long doubleToLongBits (double value);

  public static native double longBitsToDouble (long bits);
}