OLD | NEW |
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
193 CHECK_EQ(40000e-328, StrtodChar("30000", -328)); | 193 CHECK_EQ(40000e-328, StrtodChar("30000", -328)); |
194 CHECK_EQ(0.0, StrtodChar("10000", -329)); | 194 CHECK_EQ(0.0, StrtodChar("10000", -329)); |
195 CHECK_EQ(0.0, StrtodChar("90000", -329)); | 195 CHECK_EQ(0.0, StrtodChar("90000", -329)); |
196 CHECK_EQ(0.0, StrtodChar("000000001", -325)); | 196 CHECK_EQ(0.0, StrtodChar("000000001", -325)); |
197 CHECK_EQ(0.0, StrtodChar("000000001", -325)); | 197 CHECK_EQ(0.0, StrtodChar("000000001", -325)); |
198 CHECK_EQ(0.0, StrtodChar("0000000020000", -328)); | 198 CHECK_EQ(0.0, StrtodChar("0000000020000", -328)); |
199 CHECK_EQ(40000e-328, StrtodChar("00000030000", -328)); | 199 CHECK_EQ(40000e-328, StrtodChar("00000030000", -328)); |
200 CHECK_EQ(0.0, StrtodChar("0000000010000", -329)); | 200 CHECK_EQ(0.0, StrtodChar("0000000010000", -329)); |
201 CHECK_EQ(0.0, StrtodChar("0000000090000", -329)); | 201 CHECK_EQ(0.0, StrtodChar("0000000090000", -329)); |
202 | 202 |
203 // It would be more readable to put the literals (and not V8_INFINITY) on the | 203 // It would be more readable to put the literals (and not |
| 204 // std::numeric_limits<double>::infinity()) on the |
204 // left side (i.e. CHECK_EQ(1e309, StrtodChar("1", 309))), but then Gcc | 205 // left side (i.e. CHECK_EQ(1e309, StrtodChar("1", 309))), but then Gcc |
205 // complains that the floating constant exceeds range of 'double'. | 206 // complains that the floating constant exceeds range of 'double'. |
206 CHECK_EQ(V8_INFINITY, StrtodChar("1", 309)); | 207 CHECK_EQ(std::numeric_limits<double>::infinity(), StrtodChar("1", 309)); |
207 CHECK_EQ(1e308, StrtodChar("1", 308)); | 208 CHECK_EQ(1e308, StrtodChar("1", 308)); |
208 CHECK_EQ(1234e305, StrtodChar("1234", 305)); | 209 CHECK_EQ(1234e305, StrtodChar("1234", 305)); |
209 CHECK_EQ(1234e304, StrtodChar("1234", 304)); | 210 CHECK_EQ(1234e304, StrtodChar("1234", 304)); |
210 CHECK_EQ(V8_INFINITY, StrtodChar("18", 307)); | 211 CHECK_EQ(std::numeric_limits<double>::infinity(), StrtodChar("18", 307)); |
211 CHECK_EQ(17e307, StrtodChar("17", 307)); | 212 CHECK_EQ(17e307, StrtodChar("17", 307)); |
212 CHECK_EQ(V8_INFINITY, StrtodChar("0000001", 309)); | 213 CHECK_EQ(std::numeric_limits<double>::infinity(), StrtodChar("0000001", 309)); |
213 CHECK_EQ(1e308, StrtodChar("00000001", 308)); | 214 CHECK_EQ(1e308, StrtodChar("00000001", 308)); |
214 CHECK_EQ(1234e305, StrtodChar("00000001234", 305)); | 215 CHECK_EQ(1234e305, StrtodChar("00000001234", 305)); |
215 CHECK_EQ(1234e304, StrtodChar("000000001234", 304)); | 216 CHECK_EQ(1234e304, StrtodChar("000000001234", 304)); |
216 CHECK_EQ(V8_INFINITY, StrtodChar("0000000018", 307)); | 217 CHECK_EQ(std::numeric_limits<double>::infinity(), |
| 218 StrtodChar("0000000018", 307)); |
217 CHECK_EQ(17e307, StrtodChar("0000000017", 307)); | 219 CHECK_EQ(17e307, StrtodChar("0000000017", 307)); |
218 CHECK_EQ(V8_INFINITY, StrtodChar("1000000", 303)); | 220 CHECK_EQ(std::numeric_limits<double>::infinity(), StrtodChar("1000000", 303)); |
219 CHECK_EQ(1e308, StrtodChar("100000", 303)); | 221 CHECK_EQ(1e308, StrtodChar("100000", 303)); |
220 CHECK_EQ(1234e305, StrtodChar("123400000", 300)); | 222 CHECK_EQ(1234e305, StrtodChar("123400000", 300)); |
221 CHECK_EQ(1234e304, StrtodChar("123400000", 299)); | 223 CHECK_EQ(1234e304, StrtodChar("123400000", 299)); |
222 CHECK_EQ(V8_INFINITY, StrtodChar("180000000", 300)); | 224 CHECK_EQ(std::numeric_limits<double>::infinity(), |
| 225 StrtodChar("180000000", 300)); |
223 CHECK_EQ(17e307, StrtodChar("170000000", 300)); | 226 CHECK_EQ(17e307, StrtodChar("170000000", 300)); |
224 CHECK_EQ(V8_INFINITY, StrtodChar("00000001000000", 303)); | 227 CHECK_EQ(std::numeric_limits<double>::infinity(), |
| 228 StrtodChar("00000001000000", 303)); |
225 CHECK_EQ(1e308, StrtodChar("000000000000100000", 303)); | 229 CHECK_EQ(1e308, StrtodChar("000000000000100000", 303)); |
226 CHECK_EQ(1234e305, StrtodChar("00000000123400000", 300)); | 230 CHECK_EQ(1234e305, StrtodChar("00000000123400000", 300)); |
227 CHECK_EQ(1234e304, StrtodChar("0000000123400000", 299)); | 231 CHECK_EQ(1234e304, StrtodChar("0000000123400000", 299)); |
228 CHECK_EQ(V8_INFINITY, StrtodChar("00000000180000000", 300)); | 232 CHECK_EQ(std::numeric_limits<double>::infinity(), |
| 233 StrtodChar("00000000180000000", 300)); |
229 CHECK_EQ(17e307, StrtodChar("00000000170000000", 300)); | 234 CHECK_EQ(17e307, StrtodChar("00000000170000000", 300)); |
230 CHECK_EQ(1.7976931348623157E+308, StrtodChar("17976931348623157", 292)); | 235 CHECK_EQ(1.7976931348623157E+308, StrtodChar("17976931348623157", 292)); |
231 CHECK_EQ(1.7976931348623158E+308, StrtodChar("17976931348623158", 292)); | 236 CHECK_EQ(1.7976931348623158E+308, StrtodChar("17976931348623158", 292)); |
232 CHECK_EQ(V8_INFINITY, StrtodChar("17976931348623159", 292)); | 237 CHECK_EQ(std::numeric_limits<double>::infinity(), |
| 238 StrtodChar("17976931348623159", 292)); |
233 | 239 |
234 // The following number is the result of 89255.0/1e22. Both floating-point | 240 // The following number is the result of 89255.0/1e22. Both floating-point |
235 // numbers can be accurately represented with doubles. However on Linux,x86 | 241 // numbers can be accurately represented with doubles. However on Linux,x86 |
236 // the floating-point stack is set to 80bits and the double-rounding | 242 // the floating-point stack is set to 80bits and the double-rounding |
237 // introduces an error. | 243 // introduces an error. |
238 CHECK_EQ(89255e-22, StrtodChar("89255", -22)); | 244 CHECK_EQ(89255e-22, StrtodChar("89255", -22)); |
239 | 245 |
240 // Some random values. | 246 // Some random values. |
241 CHECK_EQ(358416272e-33, StrtodChar("358416272", -33)); | 247 CHECK_EQ(358416272e-33, StrtodChar("358416272", -33)); |
242 CHECK_EQ(104110013277974872254e-225, | 248 CHECK_EQ(104110013277974872254e-225, |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
400 DiyFp upper_boundary; | 406 DiyFp upper_boundary; |
401 Bignum input_digits; | 407 Bignum input_digits; |
402 input_digits.AssignDecimalString(buffer); | 408 input_digits.AssignDecimalString(buffer); |
403 if (to_check == 0.0) { | 409 if (to_check == 0.0) { |
404 const double kMinDouble = 4e-324; | 410 const double kMinDouble = 4e-324; |
405 // Check that the buffer*10^exponent < (0 + kMinDouble)/2. | 411 // Check that the buffer*10^exponent < (0 + kMinDouble)/2. |
406 Double d(kMinDouble); | 412 Double d(kMinDouble); |
407 d.NormalizedBoundaries(&lower_boundary, &upper_boundary); | 413 d.NormalizedBoundaries(&lower_boundary, &upper_boundary); |
408 return CompareBignumToDiyFp(input_digits, exponent, lower_boundary) <= 0; | 414 return CompareBignumToDiyFp(input_digits, exponent, lower_boundary) <= 0; |
409 } | 415 } |
410 if (to_check == V8_INFINITY) { | 416 if (to_check == std::numeric_limits<double>::infinity()) { |
411 const double kMaxDouble = 1.7976931348623157e308; | 417 const double kMaxDouble = 1.7976931348623157e308; |
412 // Check that the buffer*10^exponent >= boundary between kMaxDouble and inf. | 418 // Check that the buffer*10^exponent >= boundary between kMaxDouble and inf. |
413 Double d(kMaxDouble); | 419 Double d(kMaxDouble); |
414 d.NormalizedBoundaries(&lower_boundary, &upper_boundary); | 420 d.NormalizedBoundaries(&lower_boundary, &upper_boundary); |
415 return CompareBignumToDiyFp(input_digits, exponent, upper_boundary) >= 0; | 421 return CompareBignumToDiyFp(input_digits, exponent, upper_boundary) >= 0; |
416 } | 422 } |
417 Double d(to_check); | 423 Double d(to_check); |
418 d.NormalizedBoundaries(&lower_boundary, &upper_boundary); | 424 d.NormalizedBoundaries(&lower_boundary, &upper_boundary); |
419 if ((d.Significand() & 1) == 0) { | 425 if ((d.Significand() & 1) == 0) { |
420 return CompareBignumToDiyFp(input_digits, exponent, lower_boundary) >= 0 && | 426 return CompareBignumToDiyFp(input_digits, exponent, lower_boundary) >= 0 && |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
471 buffer[pos++] = rng.NextInt(10) + '0'; | 477 buffer[pos++] = rng.NextInt(10) + '0'; |
472 } | 478 } |
473 int exponent = DeterministicRandom() % (308*2 + 1) - 308 - length; | 479 int exponent = DeterministicRandom() % (308*2 + 1) - 308 - length; |
474 buffer[pos] = '\0'; | 480 buffer[pos] = '\0'; |
475 Vector<const char> vector(buffer, pos); | 481 Vector<const char> vector(buffer, pos); |
476 double strtod_result = Strtod(vector, exponent); | 482 double strtod_result = Strtod(vector, exponent); |
477 CHECK(CheckDouble(vector, exponent, strtod_result)); | 483 CHECK(CheckDouble(vector, exponent, strtod_result)); |
478 } | 484 } |
479 } | 485 } |
480 } | 486 } |
OLD | NEW |