1f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch// Copyright 2006-2008 the V8 project authors. All rights reserved. 2f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 3f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch#include <stdlib.h> 4f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 5f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch#include "v8.h" 6f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 790bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner#include "bignum.h" 8f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch#include "cctest.h" 990bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner#include "diy-fp.h" 1090bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner#include "double.h" 11f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch#include "strtod.h" 12f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 13f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdochusing namespace v8::internal; 14f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 15f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdochstatic Vector<const char> StringToVector(const char* str) { 16f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch return Vector<const char>(str, StrLength(str)); 17f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch} 18f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 19f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 20f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdochstatic double StrtodChar(const char* str, int exponent) { 21f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch return Strtod(StringToVector(str), exponent); 22f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch} 23f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 24f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 25f87a203d89e1bbb6708282e0b64dbd13d59b723dBen MurdochTEST(Strtod) { 26f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch Vector<const char> vector; 27f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 28f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch vector = StringToVector("0"); 29f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(0.0, Strtod(vector, 1)); 30f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(0.0, Strtod(vector, 2)); 31f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(0.0, Strtod(vector, -2)); 32f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(0.0, Strtod(vector, -999)); 33f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(0.0, Strtod(vector, +999)); 34f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 35f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch vector = StringToVector("1"); 36f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1.0, Strtod(vector, 0)); 37f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(10.0, Strtod(vector, 1)); 38f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(100.0, Strtod(vector, 2)); 39f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1e20, Strtod(vector, 20)); 40f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1e22, Strtod(vector, 22)); 41f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1e23, Strtod(vector, 23)); 42f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1e35, Strtod(vector, 35)); 43f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1e36, Strtod(vector, 36)); 44f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1e37, Strtod(vector, 37)); 45f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1e-1, Strtod(vector, -1)); 46f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1e-2, Strtod(vector, -2)); 47f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1e-5, Strtod(vector, -5)); 48f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1e-20, Strtod(vector, -20)); 49f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1e-22, Strtod(vector, -22)); 50f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1e-23, Strtod(vector, -23)); 51f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1e-25, Strtod(vector, -25)); 52f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1e-39, Strtod(vector, -39)); 53f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 54f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch vector = StringToVector("2"); 55f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(2.0, Strtod(vector, 0)); 56f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(20.0, Strtod(vector, 1)); 57f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(200.0, Strtod(vector, 2)); 58f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(2e20, Strtod(vector, 20)); 59f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(2e22, Strtod(vector, 22)); 60f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(2e23, Strtod(vector, 23)); 61f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(2e35, Strtod(vector, 35)); 62f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(2e36, Strtod(vector, 36)); 63f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(2e37, Strtod(vector, 37)); 64f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(2e-1, Strtod(vector, -1)); 65f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(2e-2, Strtod(vector, -2)); 66f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(2e-5, Strtod(vector, -5)); 67f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(2e-20, Strtod(vector, -20)); 68f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(2e-22, Strtod(vector, -22)); 69f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(2e-23, Strtod(vector, -23)); 70f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(2e-25, Strtod(vector, -25)); 71f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(2e-39, Strtod(vector, -39)); 72f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 73f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch vector = StringToVector("9"); 74f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(9.0, Strtod(vector, 0)); 75f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(90.0, Strtod(vector, 1)); 76f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(900.0, Strtod(vector, 2)); 77f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(9e20, Strtod(vector, 20)); 78f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(9e22, Strtod(vector, 22)); 79f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(9e23, Strtod(vector, 23)); 80f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(9e35, Strtod(vector, 35)); 81f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(9e36, Strtod(vector, 36)); 82f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(9e37, Strtod(vector, 37)); 83f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(9e-1, Strtod(vector, -1)); 84f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(9e-2, Strtod(vector, -2)); 85f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(9e-5, Strtod(vector, -5)); 86f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(9e-20, Strtod(vector, -20)); 87f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(9e-22, Strtod(vector, -22)); 88f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(9e-23, Strtod(vector, -23)); 89f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(9e-25, Strtod(vector, -25)); 90f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(9e-39, Strtod(vector, -39)); 91f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 92f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch vector = StringToVector("12345"); 93f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345.0, Strtod(vector, 0)); 94f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(123450.0, Strtod(vector, 1)); 95f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1234500.0, Strtod(vector, 2)); 96f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345e20, Strtod(vector, 20)); 97f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345e22, Strtod(vector, 22)); 98f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345e23, Strtod(vector, 23)); 99f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345e30, Strtod(vector, 30)); 100f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345e31, Strtod(vector, 31)); 101f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345e32, Strtod(vector, 32)); 102f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345e35, Strtod(vector, 35)); 103f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345e36, Strtod(vector, 36)); 104f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345e37, Strtod(vector, 37)); 105f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345e-1, Strtod(vector, -1)); 106f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345e-2, Strtod(vector, -2)); 107f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345e-5, Strtod(vector, -5)); 108f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345e-20, Strtod(vector, -20)); 109f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345e-22, Strtod(vector, -22)); 110f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345e-23, Strtod(vector, -23)); 111f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345e-25, Strtod(vector, -25)); 112f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345e-39, Strtod(vector, -39)); 113f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 114f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch vector = StringToVector("12345678901234"); 115f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345678901234.0, Strtod(vector, 0)); 116f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(123456789012340.0, Strtod(vector, 1)); 117f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1234567890123400.0, Strtod(vector, 2)); 118f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345678901234e20, Strtod(vector, 20)); 119f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345678901234e22, Strtod(vector, 22)); 120f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345678901234e23, Strtod(vector, 23)); 121f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345678901234e30, Strtod(vector, 30)); 122f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345678901234e31, Strtod(vector, 31)); 123f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345678901234e32, Strtod(vector, 32)); 124f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345678901234e35, Strtod(vector, 35)); 125f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345678901234e36, Strtod(vector, 36)); 126f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345678901234e37, Strtod(vector, 37)); 127f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345678901234e-1, Strtod(vector, -1)); 128f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345678901234e-2, Strtod(vector, -2)); 129f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345678901234e-5, Strtod(vector, -5)); 130f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345678901234e-20, Strtod(vector, -20)); 131f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345678901234e-22, Strtod(vector, -22)); 132f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345678901234e-23, Strtod(vector, -23)); 133f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345678901234e-25, Strtod(vector, -25)); 134f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345678901234e-39, Strtod(vector, -39)); 135f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 136f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch vector = StringToVector("123456789012345"); 137f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(123456789012345.0, Strtod(vector, 0)); 138f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1234567890123450.0, Strtod(vector, 1)); 139f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(12345678901234500.0, Strtod(vector, 2)); 140f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(123456789012345e20, Strtod(vector, 20)); 141f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(123456789012345e22, Strtod(vector, 22)); 142f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(123456789012345e23, Strtod(vector, 23)); 143f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(123456789012345e35, Strtod(vector, 35)); 144f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(123456789012345e36, Strtod(vector, 36)); 145f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(123456789012345e37, Strtod(vector, 37)); 146f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(123456789012345e39, Strtod(vector, 39)); 147f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(123456789012345e-1, Strtod(vector, -1)); 148f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(123456789012345e-2, Strtod(vector, -2)); 149f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(123456789012345e-5, Strtod(vector, -5)); 150f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(123456789012345e-20, Strtod(vector, -20)); 151f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(123456789012345e-22, Strtod(vector, -22)); 152f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(123456789012345e-23, Strtod(vector, -23)); 153f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(123456789012345e-25, Strtod(vector, -25)); 154f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(123456789012345e-39, Strtod(vector, -39)); 155f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 156f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(0.0, StrtodChar("0", 12345)); 157f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(0.0, StrtodChar("", 1324)); 158f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(0.0, StrtodChar("000000000", 123)); 159f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(0.0, StrtodChar("2", -324)); 160f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(4e-324, StrtodChar("3", -324)); 161f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch // It would be more readable to put non-zero literals on the left side (i.e. 162f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch // CHECK_EQ(1e-325, StrtodChar("1", -325))), but then Gcc complains that 163f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch // they are truncated to zero. 164f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(0.0, StrtodChar("1", -325)); 165f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(0.0, StrtodChar("1", -325)); 166f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(0.0, StrtodChar("20000", -328)); 167f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(40000e-328, StrtodChar("30000", -328)); 168f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(0.0, StrtodChar("10000", -329)); 169f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(0.0, StrtodChar("90000", -329)); 170f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(0.0, StrtodChar("000000001", -325)); 171f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(0.0, StrtodChar("000000001", -325)); 172f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(0.0, StrtodChar("0000000020000", -328)); 173f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(40000e-328, StrtodChar("00000030000", -328)); 174f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(0.0, StrtodChar("0000000010000", -329)); 175f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(0.0, StrtodChar("0000000090000", -329)); 176f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 177f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch // It would be more readable to put the literals (and not V8_INFINITY) on the 178f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch // left side (i.e. CHECK_EQ(1e309, StrtodChar("1", 309))), but then Gcc 179f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch // complains that the floating constant exceeds range of 'double'. 180f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(V8_INFINITY, StrtodChar("1", 309)); 181f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1e308, StrtodChar("1", 308)); 182f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1234e305, StrtodChar("1234", 305)); 183f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1234e304, StrtodChar("1234", 304)); 184f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(V8_INFINITY, StrtodChar("18", 307)); 185f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(17e307, StrtodChar("17", 307)); 186f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(V8_INFINITY, StrtodChar("0000001", 309)); 187f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1e308, StrtodChar("00000001", 308)); 188f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1234e305, StrtodChar("00000001234", 305)); 189f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1234e304, StrtodChar("000000001234", 304)); 190f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(V8_INFINITY, StrtodChar("0000000018", 307)); 191f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(17e307, StrtodChar("0000000017", 307)); 192f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(V8_INFINITY, StrtodChar("1000000", 303)); 193f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1e308, StrtodChar("100000", 303)); 194f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1234e305, StrtodChar("123400000", 300)); 195f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1234e304, StrtodChar("123400000", 299)); 196f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(V8_INFINITY, StrtodChar("180000000", 300)); 197f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(17e307, StrtodChar("170000000", 300)); 198f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(V8_INFINITY, StrtodChar("00000001000000", 303)); 199f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1e308, StrtodChar("000000000000100000", 303)); 200f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1234e305, StrtodChar("00000000123400000", 300)); 201f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(1234e304, StrtodChar("0000000123400000", 299)); 202f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(V8_INFINITY, StrtodChar("00000000180000000", 300)); 203f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(17e307, StrtodChar("00000000170000000", 300)); 2045913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(1.7976931348623157E+308, StrtodChar("17976931348623157", 292)); 2055913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(1.7976931348623158E+308, StrtodChar("17976931348623158", 292)); 2065913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(V8_INFINITY, StrtodChar("17976931348623159", 292)); 207f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch 20890bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner // The following number is the result of 89255.0/1e22. Both floating-point 209f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch // numbers can be accurately represented with doubles. However on Linux,x86 210f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch // the floating-point stack is set to 80bits and the double-rounding 211f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch // introduces an error. 212f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch CHECK_EQ(89255e-22, StrtodChar("89255", -22)); 21390bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner 21490bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner // Some random values. 21590bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CHECK_EQ(358416272e-33, StrtodChar("358416272", -33)); 2165913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(104110013277974872254e-225, 2175913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck StrtodChar("104110013277974872254", -225)); 2185913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck 2195913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(123456789e108, StrtodChar("123456789", 108)); 2205913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(123456789e109, StrtodChar("123456789", 109)); 2215913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(123456789e110, StrtodChar("123456789", 110)); 2225913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(123456789e111, StrtodChar("123456789", 111)); 2235913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(123456789e112, StrtodChar("123456789", 112)); 2245913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(123456789e113, StrtodChar("123456789", 113)); 2255913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(123456789e114, StrtodChar("123456789", 114)); 2265913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(123456789e115, StrtodChar("123456789", 115)); 2275913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck 2285913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(1234567890123456789012345e108, 2295913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck StrtodChar("1234567890123456789012345", 108)); 2305913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(1234567890123456789012345e109, 2315913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck StrtodChar("1234567890123456789012345", 109)); 2325913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(1234567890123456789012345e110, 2335913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck StrtodChar("1234567890123456789012345", 110)); 2345913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(1234567890123456789012345e111, 2355913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck StrtodChar("1234567890123456789012345", 111)); 2365913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(1234567890123456789012345e112, 2375913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck StrtodChar("1234567890123456789012345", 112)); 2385913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(1234567890123456789012345e113, 2395913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck StrtodChar("1234567890123456789012345", 113)); 2405913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(1234567890123456789012345e114, 2415913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck StrtodChar("1234567890123456789012345", 114)); 2425913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(1234567890123456789012345e115, 2435913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck StrtodChar("1234567890123456789012345", 115)); 2445913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck 2455913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(1234567890123456789052345e108, 2465913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck StrtodChar("1234567890123456789052345", 108)); 2475913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(1234567890123456789052345e109, 2485913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck StrtodChar("1234567890123456789052345", 109)); 2495913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(1234567890123456789052345e110, 2505913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck StrtodChar("1234567890123456789052345", 110)); 2515913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(1234567890123456789052345e111, 2525913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck StrtodChar("1234567890123456789052345", 111)); 2535913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(1234567890123456789052345e112, 2545913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck StrtodChar("1234567890123456789052345", 112)); 2555913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(1234567890123456789052345e113, 2565913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck StrtodChar("1234567890123456789052345", 113)); 2575913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(1234567890123456789052345e114, 2585913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck StrtodChar("1234567890123456789052345", 114)); 2595913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck CHECK_EQ(1234567890123456789052345e115, 2605913587db4c6bab03d97bfe44b06289fd6d7270dJohn Reck StrtodChar("1234567890123456789052345", 115)); 26190bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner 2628a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang CHECK_EQ(5.445618932859895e-255, 2638a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang StrtodChar("5445618932859895362967233318697132813618813095743952975" 2648a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang "4392982234069699615600475529427176366709107287468930197" 2658a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang "8628345413991790019316974825934906752493984055268219809" 2668a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang "5012176093045431437495773903922425632551857520884625114" 2678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang "6241265881735209066709685420744388526014389929047617597" 2688a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang "0302268848374508109029268898695825171158085457567481507" 2698a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang "4162979705098246243690189880319928315307816832576838178" 2708a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang "2563074014542859888710209237525873301724479666744537857" 2718a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang "9026553346649664045621387124193095870305991178772256504" 2728a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang "4368663670643970181259143319016472430928902201239474588" 2738a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang "1392338901353291306607057623202353588698746085415097902" 2748a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang "6640064319118728664842287477491068264828851624402189317" 2758a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang "2769161449825765517353755844373640588822904791244190695" 2768a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang "2998382932630754670573838138825217065450843010498555058" 2778a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang "88186560731", -1035)); 2788a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 27990bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner // Boundary cases. Boundaries themselves should round to even. 28090bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner // 28190bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner // 0x1FFFFFFFFFFFF * 2^3 = 72057594037927928 28290bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner // next: 72057594037927936 28390bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner // boundary: 72057594037927932 should round up. 28490bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CHECK_EQ(72057594037927928.0, StrtodChar("72057594037927928", 0)); 28590bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CHECK_EQ(72057594037927936.0, StrtodChar("72057594037927936", 0)); 28690bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CHECK_EQ(72057594037927936.0, StrtodChar("72057594037927932", 0)); 28790bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CHECK_EQ(72057594037927928.0, StrtodChar("7205759403792793199999", -5)); 28890bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CHECK_EQ(72057594037927936.0, StrtodChar("7205759403792793200001", -5)); 28990bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner 29090bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner // 0x1FFFFFFFFFFFF * 2^10 = 9223372036854774784 29190bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner // next: 9223372036854775808 29290bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner // boundary: 9223372036854775296 should round up. 29390bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CHECK_EQ(9223372036854774784.0, StrtodChar("9223372036854774784", 0)); 29490bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CHECK_EQ(9223372036854775808.0, StrtodChar("9223372036854775808", 0)); 29590bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CHECK_EQ(9223372036854775808.0, StrtodChar("9223372036854775296", 0)); 29690bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CHECK_EQ(9223372036854774784.0, StrtodChar("922337203685477529599999", -5)); 29790bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CHECK_EQ(9223372036854775808.0, StrtodChar("922337203685477529600001", -5)); 29890bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner 29990bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner // 0x1FFFFFFFFFFFF * 2^50 = 10141204801825834086073718800384 30090bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner // next: 10141204801825835211973625643008 30190bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner // boundary: 10141204801825834649023672221696 should round up. 30290bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CHECK_EQ(10141204801825834086073718800384.0, 30390bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner StrtodChar("10141204801825834086073718800384", 0)); 30490bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CHECK_EQ(10141204801825835211973625643008.0, 30590bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner StrtodChar("10141204801825835211973625643008", 0)); 30690bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CHECK_EQ(10141204801825835211973625643008.0, 30790bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner StrtodChar("10141204801825834649023672221696", 0)); 30890bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CHECK_EQ(10141204801825834086073718800384.0, 30990bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner StrtodChar("1014120480182583464902367222169599999", -5)); 31090bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CHECK_EQ(10141204801825835211973625643008.0, 31190bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner StrtodChar("1014120480182583464902367222169600001", -5)); 31290bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner 31390bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner // 0x1FFFFFFFFFFFF * 2^99 = 5708990770823838890407843763683279797179383808 31490bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner // next: 5708990770823839524233143877797980545530986496 31590bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner // boundary: 5708990770823839207320493820740630171355185152 31690bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner // The boundary should round up. 31790bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CHECK_EQ(5708990770823838890407843763683279797179383808.0, 31890bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner StrtodChar("5708990770823838890407843763683279797179383808", 0)); 31990bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CHECK_EQ(5708990770823839524233143877797980545530986496.0, 32090bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner StrtodChar("5708990770823839524233143877797980545530986496", 0)); 32190bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CHECK_EQ(5708990770823839524233143877797980545530986496.0, 32290bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner StrtodChar("5708990770823839207320493820740630171355185152", 0)); 32390bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CHECK_EQ(5708990770823838890407843763683279797179383808.0, 32490bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner StrtodChar("5708990770823839207320493820740630171355185151999", -3)); 32590bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CHECK_EQ(5708990770823839524233143877797980545530986496.0, 32690bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner StrtodChar("5708990770823839207320493820740630171355185152001", -3)); 3271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // The following test-cases got some public attention in early 2011 when they 3291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // sent Java and PHP into an infinite loop. 3301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block CHECK_EQ(2.225073858507201e-308, StrtodChar("22250738585072011", -324)); 3311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block CHECK_EQ(2.22507385850720138309e-308, 3321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block StrtodChar("22250738585072011360574097967091319759348195463516456480" 3331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "23426109724822222021076945516529523908135087914149158913" 3341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "03962110687008643869459464552765720740782062174337998814" 3351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "10632673292535522868813721490129811224514518898490572223" 3361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "07285255133155755015914397476397983411801999323962548289" 3371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "01710708185069063066665599493827577257201576306269066333" 3381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "26475653000092458883164330377797918696120494973903778297" 3391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "04905051080609940730262937128958950003583799967207254304" 3401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "36028407889577179615094551674824347103070260914462157228" 3411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "98802581825451803257070188608721131280795122334262883686" 3421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "22321503775666622503982534335974568884423900265498198385" 3431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "48794829220689472168983109969836584681402285424333066033" 3441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "98508864458040010349339704275671864433837704860378616227" 3451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block "71738545623065874679014086723327636718751", -1076)); 34690bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner} 34790bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner 34890bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner 34990bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brennerstatic int CompareBignumToDiyFp(const Bignum& bignum_digits, 35090bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner int bignum_exponent, 35190bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner DiyFp diy_fp) { 35290bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner Bignum bignum; 35390bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner bignum.AssignBignum(bignum_digits); 35490bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner Bignum other; 35590bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner other.AssignUInt64(diy_fp.f()); 35690bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner if (bignum_exponent >= 0) { 35790bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner bignum.MultiplyByPowerOfTen(bignum_exponent); 35890bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner } else { 35990bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner other.MultiplyByPowerOfTen(-bignum_exponent); 36090bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner } 36190bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner if (diy_fp.e() >= 0) { 36290bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner other.ShiftLeft(diy_fp.e()); 36390bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner } else { 36490bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner bignum.ShiftLeft(-diy_fp.e()); 36590bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner } 36690bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner return Bignum::Compare(bignum, other); 36790bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner} 36890bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner 36990bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner 37090bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brennerstatic bool CheckDouble(Vector<const char> buffer, 37190bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner int exponent, 37290bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner double to_check) { 37390bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner DiyFp lower_boundary; 37490bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner DiyFp upper_boundary; 37590bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner Bignum input_digits; 37690bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner input_digits.AssignDecimalString(buffer); 37790bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner if (to_check == 0.0) { 37890bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner const double kMinDouble = 4e-324; 37990bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner // Check that the buffer*10^exponent < (0 + kMinDouble)/2. 38090bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner Double d(kMinDouble); 38190bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner d.NormalizedBoundaries(&lower_boundary, &upper_boundary); 38290bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner return CompareBignumToDiyFp(input_digits, exponent, lower_boundary) <= 0; 38390bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner } 38490bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner if (to_check == V8_INFINITY) { 38590bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner const double kMaxDouble = 1.7976931348623157e308; 38690bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner // Check that the buffer*10^exponent >= boundary between kMaxDouble and inf. 38790bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner Double d(kMaxDouble); 38890bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner d.NormalizedBoundaries(&lower_boundary, &upper_boundary); 38990bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner return CompareBignumToDiyFp(input_digits, exponent, upper_boundary) >= 0; 39090bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner } 39190bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner Double d(to_check); 39290bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner d.NormalizedBoundaries(&lower_boundary, &upper_boundary); 39390bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner if ((d.Significand() & 1) == 0) { 39490bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner return CompareBignumToDiyFp(input_digits, exponent, lower_boundary) >= 0 && 39590bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CompareBignumToDiyFp(input_digits, exponent, upper_boundary) <= 0; 39690bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner } else { 39790bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner return CompareBignumToDiyFp(input_digits, exponent, lower_boundary) > 0 && 39890bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CompareBignumToDiyFp(input_digits, exponent, upper_boundary) < 0; 39990bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner } 40090bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner} 40190bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner 40290bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner 40390bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner// Copied from v8.cc and adapted to make the function deterministic. 40490bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brennerstatic uint32_t DeterministicRandom() { 40590bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner // Random number generator using George Marsaglia's MWC algorithm. 40690bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner static uint32_t hi = 0; 40790bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner static uint32_t lo = 0; 40890bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner 40990bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner // Initialization values don't have any special meaning. (They are the result 41090bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner // of two calls to random().) 41190bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner if (hi == 0) hi = 0xbfe166e7; 41290bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner if (lo == 0) lo = 0x64d1c3c9; 41390bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner 41490bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner // Mix the bits. 41590bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner hi = 36969 * (hi & 0xFFFF) + (hi >> 16); 41690bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner lo = 18273 * (lo & 0xFFFF) + (lo >> 16); 41790bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner return (hi << 16) + (lo & 0xFFFF); 41890bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner} 41990bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner 42090bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner 42190bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brennerstatic const int kBufferSize = 1024; 42290bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brennerstatic const int kShortStrtodRandomCount = 2; 42390bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brennerstatic const int kLargeStrtodRandomCount = 2; 42490bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner 42590bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell BrennerTEST(RandomStrtod) { 42690bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner char buffer[kBufferSize]; 42790bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner for (int length = 1; length < 15; length++) { 42890bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner for (int i = 0; i < kShortStrtodRandomCount; ++i) { 42990bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner int pos = 0; 43090bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner for (int j = 0; j < length; ++j) { 43190bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner buffer[pos++] = random() % 10 + '0'; 43290bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner } 43390bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner int exponent = DeterministicRandom() % (25*2 + 1) - 25 - length; 43490bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner buffer[pos] = '\0'; 43590bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner Vector<const char> vector(buffer, pos); 43690bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner double strtod_result = Strtod(vector, exponent); 43790bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CHECK(CheckDouble(vector, exponent, strtod_result)); 43890bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner } 43990bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner } 44090bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner for (int length = 15; length < 800; length += 2) { 44190bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner for (int i = 0; i < kLargeStrtodRandomCount; ++i) { 44290bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner int pos = 0; 44390bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner for (int j = 0; j < length; ++j) { 44490bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner buffer[pos++] = random() % 10 + '0'; 44590bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner } 44690bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner int exponent = DeterministicRandom() % (308*2 + 1) - 308 - length; 44790bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner buffer[pos] = '\0'; 44890bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner Vector<const char> vector(buffer, pos); 44990bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner double strtod_result = Strtod(vector, exponent); 45090bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner CHECK(CheckDouble(vector, exponent, strtod_result)); 45190bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner } 45290bac256d9f48d4ee52d0e08bf0e5cad57b3c51cRussell Brenner } 453f87a203d89e1bbb6708282e0b64dbd13d59b723dBen Murdoch} 454