| 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 | 2 |
| 3 #include <stdlib.h> | 3 #include <stdlib.h> |
| 4 | 4 |
| 5 #include "v8.h" | 5 #include "v8.h" |
| 6 | 6 |
| 7 #include "bignum.h" | 7 #include "bignum.h" |
| 8 #include "cctest.h" | 8 #include "cctest.h" |
| 9 #include "diy-fp.h" | 9 #include "diy-fp.h" |
| 10 #include "double.h" | 10 #include "double.h" |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 StrtodChar("1234567890123456789052345", 111)); | 252 StrtodChar("1234567890123456789052345", 111)); |
| 253 CHECK_EQ(1234567890123456789052345e112, | 253 CHECK_EQ(1234567890123456789052345e112, |
| 254 StrtodChar("1234567890123456789052345", 112)); | 254 StrtodChar("1234567890123456789052345", 112)); |
| 255 CHECK_EQ(1234567890123456789052345e113, | 255 CHECK_EQ(1234567890123456789052345e113, |
| 256 StrtodChar("1234567890123456789052345", 113)); | 256 StrtodChar("1234567890123456789052345", 113)); |
| 257 CHECK_EQ(1234567890123456789052345e114, | 257 CHECK_EQ(1234567890123456789052345e114, |
| 258 StrtodChar("1234567890123456789052345", 114)); | 258 StrtodChar("1234567890123456789052345", 114)); |
| 259 CHECK_EQ(1234567890123456789052345e115, | 259 CHECK_EQ(1234567890123456789052345e115, |
| 260 StrtodChar("1234567890123456789052345", 115)); | 260 StrtodChar("1234567890123456789052345", 115)); |
| 261 | 261 |
| 262 // Boundary cases. | 262 // Boundary cases. Boundaries themselves should round to even. |
| 263 // |
| 263 // 0x1FFFFFFFFFFFF * 2^3 = 72057594037927928 | 264 // 0x1FFFFFFFFFFFF * 2^3 = 72057594037927928 |
| 264 // next: 72057594037927936 | 265 // next: 72057594037927936 |
| 265 // boundary: 72057594037927932 | 266 // boundary: 72057594037927932 should round up. |
| 266 CHECK_EQ(72057594037927928.0, StrtodChar("72057594037927928", 0)); | 267 CHECK_EQ(72057594037927928.0, StrtodChar("72057594037927928", 0)); |
| 267 CHECK_EQ(72057594037927936.0, StrtodChar("72057594037927936", 0)); | 268 CHECK_EQ(72057594037927936.0, StrtodChar("72057594037927936", 0)); |
| 268 CHECK_EQ(72057594037927936.0, StrtodChar("72057594037927932", 0)); | 269 CHECK_EQ(72057594037927936.0, StrtodChar("72057594037927932", 0)); |
| 269 CHECK_EQ(72057594037927928.0, StrtodChar("7205759403792793199999", -5)); | 270 CHECK_EQ(72057594037927928.0, StrtodChar("7205759403792793199999", -5)); |
| 270 CHECK_EQ(72057594037927936.0, StrtodChar("7205759403792793200001", -5)); | 271 CHECK_EQ(72057594037927936.0, StrtodChar("7205759403792793200001", -5)); |
| 271 | 272 |
| 272 // 0x1FFFFFFFFFFFF * 2^10 = 9223372036854774784 | 273 // 0x1FFFFFFFFFFFF * 2^10 = 9223372036854774784 |
| 273 // next: 9223372036854775808 | 274 // next: 9223372036854775808 |
| 274 // boundary: 9223372036854775296 | 275 // boundary: 9223372036854775296 should round up. |
| 275 CHECK_EQ(9223372036854774784.0, StrtodChar("9223372036854774784", 0)); | 276 CHECK_EQ(9223372036854774784.0, StrtodChar("9223372036854774784", 0)); |
| 276 CHECK_EQ(9223372036854775808.0, StrtodChar("9223372036854775808", 0)); | 277 CHECK_EQ(9223372036854775808.0, StrtodChar("9223372036854775808", 0)); |
| 277 CHECK_EQ(9223372036854775296.0, StrtodChar("9223372036854775296", 0)); | 278 CHECK_EQ(9223372036854775808.0, StrtodChar("9223372036854775296", 0)); |
| 278 CHECK_EQ(9223372036854774784.0, StrtodChar("922337203685477529599999", -5)); | 279 CHECK_EQ(9223372036854774784.0, StrtodChar("922337203685477529599999", -5)); |
| 279 CHECK_EQ(9223372036854775808.0, StrtodChar("922337203685477529600001", -5)); | 280 CHECK_EQ(9223372036854775808.0, StrtodChar("922337203685477529600001", -5)); |
| 280 | 281 |
| 281 // 0x1FFFFFFFFFFFF * 2^50 = 10141204801825834086073718800384 | 282 // 0x1FFFFFFFFFFFF * 2^50 = 10141204801825834086073718800384 |
| 282 // next: 10141204801825835211973625643008 | 283 // next: 10141204801825835211973625643008 |
| 283 // boundary: 10141204801825834649023672221696 | 284 // boundary: 10141204801825834649023672221696 should round up. |
| 284 CHECK_EQ(10141204801825834086073718800384.0, | 285 CHECK_EQ(10141204801825834086073718800384.0, |
| 285 StrtodChar("10141204801825834086073718800384", 0)); | 286 StrtodChar("10141204801825834086073718800384", 0)); |
| 286 CHECK_EQ(10141204801825835211973625643008.0, | 287 CHECK_EQ(10141204801825835211973625643008.0, |
| 287 StrtodChar("10141204801825835211973625643008", 0)); | 288 StrtodChar("10141204801825835211973625643008", 0)); |
| 288 CHECK_EQ(10141204801825834649023672221696.0, | 289 CHECK_EQ(10141204801825835211973625643008.0, |
| 289 StrtodChar("10141204801825834649023672221696", 0)); | 290 StrtodChar("10141204801825834649023672221696", 0)); |
| 290 CHECK_EQ(10141204801825834086073718800384.0, | 291 CHECK_EQ(10141204801825834086073718800384.0, |
| 291 StrtodChar("1014120480182583464902367222169599999", -5)); | 292 StrtodChar("1014120480182583464902367222169599999", -5)); |
| 292 CHECK_EQ(10141204801825835211973625643008.0, | 293 CHECK_EQ(10141204801825835211973625643008.0, |
| 293 StrtodChar("1014120480182583464902367222169600001", -5)); | 294 StrtodChar("1014120480182583464902367222169600001", -5)); |
| 294 | 295 |
| 295 // 0x1FFFFFFFFFFFF * 2^99 = 5708990770823838890407843763683279797179383808 | 296 // 0x1FFFFFFFFFFFF * 2^99 = 5708990770823838890407843763683279797179383808 |
| 296 // next: 5708990770823839524233143877797980545530986496 | 297 // next: 5708990770823839524233143877797980545530986496 |
| 297 // boundary: 5708990770823839207320493820740630171355185152 | 298 // boundary: 5708990770823839207320493820740630171355185152 |
| 299 // The boundary should round up. |
| 298 CHECK_EQ(5708990770823838890407843763683279797179383808.0, | 300 CHECK_EQ(5708990770823838890407843763683279797179383808.0, |
| 299 StrtodChar("5708990770823838890407843763683279797179383808", 0)); | 301 StrtodChar("5708990770823838890407843763683279797179383808", 0)); |
| 300 CHECK_EQ(5708990770823839524233143877797980545530986496.0, | 302 CHECK_EQ(5708990770823839524233143877797980545530986496.0, |
| 301 StrtodChar("5708990770823839524233143877797980545530986496", 0)); | 303 StrtodChar("5708990770823839524233143877797980545530986496", 0)); |
| 302 CHECK_EQ(5708990770823839207320493820740630171355185152.0, | 304 CHECK_EQ(5708990770823839524233143877797980545530986496.0, |
| 303 StrtodChar("5708990770823839207320493820740630171355185152", 0)); | 305 StrtodChar("5708990770823839207320493820740630171355185152", 0)); |
| 304 CHECK_EQ(5708990770823838890407843763683279797179383808.0, | 306 CHECK_EQ(5708990770823838890407843763683279797179383808.0, |
| 305 StrtodChar("5708990770823839207320493820740630171355185151999", -3)); | 307 StrtodChar("5708990770823839207320493820740630171355185151999", -3)); |
| 306 CHECK_EQ(5708990770823839524233143877797980545530986496.0, | 308 CHECK_EQ(5708990770823839524233143877797980545530986496.0, |
| 307 StrtodChar("5708990770823839207320493820740630171355185152001", -3)); | 309 StrtodChar("5708990770823839207320493820740630171355185152001", -3)); |
| 308 } | 310 } |
| 309 | 311 |
| 310 | 312 |
| 311 static int CompareBignumToDiyFp(const Bignum& bignum_digits, | 313 static int CompareBignumToDiyFp(const Bignum& bignum_digits, |
| 312 int bignum_exponent, | 314 int bignum_exponent, |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 406 buffer[pos++] = random() % 10 + '0'; | 408 buffer[pos++] = random() % 10 + '0'; |
| 407 } | 409 } |
| 408 int exponent = DeterministicRandom() % (308*2 + 1) - 308 - length; | 410 int exponent = DeterministicRandom() % (308*2 + 1) - 308 - length; |
| 409 buffer[pos] = '\0'; | 411 buffer[pos] = '\0'; |
| 410 Vector<const char> vector(buffer, pos); | 412 Vector<const char> vector(buffer, pos); |
| 411 double strtod_result = Strtod(vector, exponent); | 413 double strtod_result = Strtod(vector, exponent); |
| 412 CHECK(CheckDouble(vector, exponent, strtod_result)); | 414 CHECK(CheckDouble(vector, exponent, strtod_result)); |
| 413 } | 415 } |
| 414 } | 416 } |
| 415 } | 417 } |
| OLD | NEW |