| OLD | NEW |
| 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 class Double implements double { | 5 class Double implements double { |
| 6 factory Double.fromInteger(int value) | 6 factory Double.fromInteger(int value) |
| 7 native "Double_doubleFromInteger"; | 7 native "Double_doubleFromInteger"; |
| 8 int hashCode() { | 8 int hashCode() { |
| 9 try { | 9 try { |
| 10 return toInt(); | 10 return toInt(); |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 } | 101 } |
| 102 | 102 |
| 103 double round() native "Double_round"; | 103 double round() native "Double_round"; |
| 104 double floor() native "Double_floor"; | 104 double floor() native "Double_floor"; |
| 105 double ceil () native "Double_ceil"; | 105 double ceil () native "Double_ceil"; |
| 106 double truncate() native "Double_truncate"; | 106 double truncate() native "Double_truncate"; |
| 107 int toInt() native "Double_toInt"; | 107 int toInt() native "Double_toInt"; |
| 108 double toDouble() { return this; } | 108 double toDouble() { return this; } |
| 109 | 109 |
| 110 double pow(num exponent) { | 110 double pow(num exponent) { |
| 111 return pow_(exponent.toDouble()); | 111 return _pow(exponent.toDouble()); |
| 112 } | 112 } |
| 113 double pow_(double exponent) native "Double_pow"; | 113 double _pow(double exponent) native "Double_pow"; |
| 114 | 114 |
| 115 String toStringAsFixed(int fractionDigits) { | 115 String toStringAsFixed(int fractionDigits) { |
| 116 // See ECMAScript-262, 15.7.4.5 for details. | 116 // See ECMAScript-262, 15.7.4.5 for details. |
| 117 | 117 |
| 118 // Step 2. | 118 // Step 2. |
| 119 if (fractionDigits < 0 || fractionDigits > 20) { | 119 if (fractionDigits < 0 || fractionDigits > 20) { |
| 120 // TODO(antonm): should be proper RangeError or Dart counterpart. | 120 // TODO(antonm): should be proper RangeError or Dart counterpart. |
| 121 throw "Range error"; | 121 throw "Range error"; |
| 122 } | 122 } |
| 123 | 123 |
| 124 // Step 3. | 124 // Step 3. |
| 125 double x = this; | 125 double x = this; |
| 126 | 126 |
| 127 // Step 4. | 127 // Step 4. |
| 128 if (x.isNaN()) { | 128 if (isNaN()) return "NaN"; |
| 129 return "NaN"; | 129 |
| 130 // Step 5 and 6 skipped. Will be dealt with by native function. |
| 131 |
| 132 // Step 7. |
| 133 if (x >= 1e21 || x <= -1e21) { |
| 134 return x.toString(); |
| 130 } | 135 } |
| 131 | 136 |
| 132 // Step 5. | 137 return _toStringAsFixed(fractionDigits); |
| 133 String s = ""; | 138 } |
| 139 String _toStringAsFixed(int fractionDigits) native "Double_toStringAsFixed"; |
| 134 | 140 |
| 135 // Step 6. | 141 String toStringAsExponential(int fractionDigits) { |
| 136 if (x.isNegative() && x != 0.0) { | 142 // See ECMAScript-262, 15.7.4.6 for details. |
| 137 s = "-"; | 143 |
| 138 x = -x; | 144 // The EcmaScript specification checks for NaN and Infinity before looking |
| 145 // at the fractionDigits. In Dart we are consistent with toStringAsFixed and |
| 146 // look at the fractionDigits first. |
| 147 |
| 148 // Step 7. |
| 149 if (fractionDigits < 0 || fractionDigits > 20) { |
| 150 // TODO(antonm): should be proper RangeError or Dart counterpart. |
| 151 throw "Range error"; |
| 139 } | 152 } |
| 140 | 153 |
| 141 // Step 7. | 154 return _toStringAsExponential(fractionDigits); |
| 142 String m; | 155 } |
| 143 if (x > 10e21) { | 156 String _toStringAsExponential(int fractionDigits) |
| 144 m = x.toString(); | 157 native "Double_toStringAsExponential"; |
| 145 } else { | |
| 146 // Step 8. | |
| 147 | 158 |
| 148 // Step 8.a. | 159 String toStringAsPrecision(int precision) { |
| 149 // This is an approximation for n from the standard. | 160 // See ECMAScript-262, 15.7.4.7 for details. |
| 150 int n = (x * (10.0).pow(fractionDigits)).round().toInt(); | |
| 151 | 161 |
| 152 // Step 8.b. | 162 // The EcmaScript specification checks for NaN and Infinity before looking |
| 153 m = n.toString(); | 163 // at the fractionDigits. In Dart we are consistent with toStringAsFixed and |
| 164 // look at the fractionDigits first. |
| 154 | 165 |
| 155 // Step 8.c. | 166 // Step 8. |
| 156 if (fractionDigits != 0) { | 167 if (precision < 1 || precision > 21) { |
| 157 // Step 8.c.i. | 168 // TODO(antonm): should be proper RangeError or Dart counterpart. |
| 158 int k = m.length; | 169 throw "Range error"; |
| 159 // Step 8.c.ii. | |
| 160 if (k <= fractionDigits) { | |
| 161 StringBuffer sb = new StringBuffer(); | |
| 162 for (int i = 0; i < fractionDigits + 1 - k; i++) { | |
| 163 sb.add("0"); | |
| 164 } | |
| 165 String z = sb.toString(); | |
| 166 m = z + m; | |
| 167 k = fractionDigits + 1; | |
| 168 } | |
| 169 // Step 8.c.iii. | |
| 170 String a = m.substring(0, k - fractionDigits); | |
| 171 String b = m.substring(k - fractionDigits); | |
| 172 // Step 8.c.iv. | |
| 173 m = a + "." + b; | |
| 174 } | |
| 175 } | 170 } |
| 176 | 171 |
| 177 // Step 9. | 172 return _toStringAsPrecision(precision); |
| 178 return s + m; | |
| 179 } | 173 } |
| 180 String toStringAsExponential(int fractionDigits) { | 174 String _toStringAsPrecision(int fractionDigits) |
| 181 throw "Double.toStringAsExponential unimplemented."; | 175 native "Double_toStringAsPrecision"; |
| 182 } | 176 |
| 183 String toStringAsPrecision(int precision) { | |
| 184 throw "Double.toStringAsPrecision unimplemented."; | |
| 185 } | |
| 186 String toRadixString(int radix) { | 177 String toRadixString(int radix) { |
| 187 throw "Double.toRadixString unimplemented."; | 178 throw "Double.toRadixString unimplemented."; |
| 188 } | 179 } |
| 189 | 180 |
| 190 // Order is: NaN > Infinity > ... > 0.0 > -0.0 > ... > -Infinity. | 181 // Order is: NaN > Infinity > ... > 0.0 > -0.0 > ... > -Infinity. |
| 191 int compareTo(Comparable other) { | 182 int compareTo(Comparable other) { |
| 192 final int EQUAL = 0, LESS = -1, GREATER = 1; | 183 final int EQUAL = 0, LESS = -1, GREATER = 1; |
| 193 if (this < other) { | 184 if (this < other) { |
| 194 return LESS; | 185 return LESS; |
| 195 } else if (this > other) { | 186 } else if (this > other) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 206 return EQUAL; | 197 return EQUAL; |
| 207 } | 198 } |
| 208 } else if (isNaN()) { | 199 } else if (isNaN()) { |
| 209 return other.isNaN() ? EQUAL : GREATER; | 200 return other.isNaN() ? EQUAL : GREATER; |
| 210 } else { | 201 } else { |
| 211 // Other is NaN. | 202 // Other is NaN. |
| 212 return LESS; | 203 return LESS; |
| 213 } | 204 } |
| 214 } | 205 } |
| 215 } | 206 } |
| OLD | NEW |