1b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org// Copyright 2006-2008 the V8 project authors. All rights reserved. 2750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// Redistribution and use in source and binary forms, with or without 3750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// modification, are permitted provided that the following conditions are 4750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// met: 5750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// 6750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// * Redistributions of source code must retain the above copyright 7750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// notice, this list of conditions and the following disclaimer. 8750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// * Redistributions in binary form must reproduce the above 9750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// copyright notice, this list of conditions and the following 10750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// disclaimer in the documentation and/or other materials provided 11750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// with the distribution. 12750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// * Neither the name of Google Inc. nor the names of its 13750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// contributors may be used to endorse or promote products derived 14750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// from this software without specific prior written permission. 15750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// 16750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 28b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org#include <stdlib.h> 29b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 30196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 31196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org 32196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/bignum.h" 33196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/diy-fp.h" 34196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/double.h" 35196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/strtod.h" 36196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/utils/random-number-generator.h" 37196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "test/cctest/cctest.h" 38b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 39b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.orgusing namespace v8::internal; 40b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 4142841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.orgstatic Vector<const char> StringToVector(const char* str) { 4242841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org return Vector<const char>(str, StrLength(str)); 4342841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org} 4442841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org 4542841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org 4642841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.orgstatic double StrtodChar(const char* str, int exponent) { 4742841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org return Strtod(StringToVector(str), exponent); 4842841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org} 49b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 50b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 51b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.orgTEST(Strtod) { 5242841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org Vector<const char> vector; 53b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 5442841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org vector = StringToVector("0"); 55b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(0.0, Strtod(vector, 1)); 56b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(0.0, Strtod(vector, 2)); 57b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(0.0, Strtod(vector, -2)); 58b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(0.0, Strtod(vector, -999)); 59b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(0.0, Strtod(vector, +999)); 60b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 6142841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org vector = StringToVector("1"); 62b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(1.0, Strtod(vector, 0)); 63b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(10.0, Strtod(vector, 1)); 64b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(100.0, Strtod(vector, 2)); 65b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(1e20, Strtod(vector, 20)); 66b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(1e22, Strtod(vector, 22)); 67b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(1e23, Strtod(vector, 23)); 68b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(1e35, Strtod(vector, 35)); 69b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(1e36, Strtod(vector, 36)); 70b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(1e37, Strtod(vector, 37)); 71b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(1e-1, Strtod(vector, -1)); 72b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(1e-2, Strtod(vector, -2)); 73b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(1e-5, Strtod(vector, -5)); 74b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(1e-20, Strtod(vector, -20)); 75b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(1e-22, Strtod(vector, -22)); 76b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(1e-23, Strtod(vector, -23)); 77b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(1e-25, Strtod(vector, -25)); 78b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(1e-39, Strtod(vector, -39)); 79b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 8042841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org vector = StringToVector("2"); 81b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(2.0, Strtod(vector, 0)); 82b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(20.0, Strtod(vector, 1)); 83b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(200.0, Strtod(vector, 2)); 84b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(2e20, Strtod(vector, 20)); 85b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(2e22, Strtod(vector, 22)); 86b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(2e23, Strtod(vector, 23)); 87b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(2e35, Strtod(vector, 35)); 88b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(2e36, Strtod(vector, 36)); 89b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(2e37, Strtod(vector, 37)); 90b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(2e-1, Strtod(vector, -1)); 91b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(2e-2, Strtod(vector, -2)); 92b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(2e-5, Strtod(vector, -5)); 93b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(2e-20, Strtod(vector, -20)); 94b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(2e-22, Strtod(vector, -22)); 95b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(2e-23, Strtod(vector, -23)); 96b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(2e-25, Strtod(vector, -25)); 97b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(2e-39, Strtod(vector, -39)); 98b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 9942841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org vector = StringToVector("9"); 100b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(9.0, Strtod(vector, 0)); 101b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(90.0, Strtod(vector, 1)); 102b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(900.0, Strtod(vector, 2)); 103b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(9e20, Strtod(vector, 20)); 104b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(9e22, Strtod(vector, 22)); 105b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(9e23, Strtod(vector, 23)); 106b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(9e35, Strtod(vector, 35)); 107b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(9e36, Strtod(vector, 36)); 108b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(9e37, Strtod(vector, 37)); 109b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(9e-1, Strtod(vector, -1)); 110b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(9e-2, Strtod(vector, -2)); 111b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(9e-5, Strtod(vector, -5)); 112b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(9e-20, Strtod(vector, -20)); 113b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(9e-22, Strtod(vector, -22)); 114b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(9e-23, Strtod(vector, -23)); 115b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(9e-25, Strtod(vector, -25)); 116b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(9e-39, Strtod(vector, -39)); 117b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 11842841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org vector = StringToVector("12345"); 119b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345.0, Strtod(vector, 0)); 120b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(123450.0, Strtod(vector, 1)); 121b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(1234500.0, Strtod(vector, 2)); 122b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345e20, Strtod(vector, 20)); 123b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345e22, Strtod(vector, 22)); 124b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345e23, Strtod(vector, 23)); 125b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345e30, Strtod(vector, 30)); 126b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345e31, Strtod(vector, 31)); 127b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345e32, Strtod(vector, 32)); 128b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345e35, Strtod(vector, 35)); 129b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345e36, Strtod(vector, 36)); 130b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345e37, Strtod(vector, 37)); 131b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345e-1, Strtod(vector, -1)); 132b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345e-2, Strtod(vector, -2)); 133b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345e-5, Strtod(vector, -5)); 134b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345e-20, Strtod(vector, -20)); 135b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345e-22, Strtod(vector, -22)); 136b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345e-23, Strtod(vector, -23)); 137b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345e-25, Strtod(vector, -25)); 138b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345e-39, Strtod(vector, -39)); 139b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 14042841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org vector = StringToVector("12345678901234"); 141b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345678901234.0, Strtod(vector, 0)); 142b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(123456789012340.0, Strtod(vector, 1)); 143b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(1234567890123400.0, Strtod(vector, 2)); 144b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345678901234e20, Strtod(vector, 20)); 145b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345678901234e22, Strtod(vector, 22)); 146b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345678901234e23, Strtod(vector, 23)); 147b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345678901234e30, Strtod(vector, 30)); 148b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345678901234e31, Strtod(vector, 31)); 149b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345678901234e32, Strtod(vector, 32)); 150b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345678901234e35, Strtod(vector, 35)); 151b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345678901234e36, Strtod(vector, 36)); 152b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345678901234e37, Strtod(vector, 37)); 153b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345678901234e-1, Strtod(vector, -1)); 154b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345678901234e-2, Strtod(vector, -2)); 155b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345678901234e-5, Strtod(vector, -5)); 156b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345678901234e-20, Strtod(vector, -20)); 157b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345678901234e-22, Strtod(vector, -22)); 158b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345678901234e-23, Strtod(vector, -23)); 159b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345678901234e-25, Strtod(vector, -25)); 160b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345678901234e-39, Strtod(vector, -39)); 161b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org 16242841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org vector = StringToVector("123456789012345"); 163b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(123456789012345.0, Strtod(vector, 0)); 164b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(1234567890123450.0, Strtod(vector, 1)); 165b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(12345678901234500.0, Strtod(vector, 2)); 166b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(123456789012345e20, Strtod(vector, 20)); 167b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(123456789012345e22, Strtod(vector, 22)); 168b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(123456789012345e23, Strtod(vector, 23)); 169b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(123456789012345e35, Strtod(vector, 35)); 170b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(123456789012345e36, Strtod(vector, 36)); 171b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(123456789012345e37, Strtod(vector, 37)); 172b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(123456789012345e39, Strtod(vector, 39)); 173b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(123456789012345e-1, Strtod(vector, -1)); 174b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(123456789012345e-2, Strtod(vector, -2)); 175b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(123456789012345e-5, Strtod(vector, -5)); 176b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(123456789012345e-20, Strtod(vector, -20)); 177b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(123456789012345e-22, Strtod(vector, -22)); 178b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(123456789012345e-23, Strtod(vector, -23)); 179b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(123456789012345e-25, Strtod(vector, -25)); 180b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org CHECK_EQ(123456789012345e-39, Strtod(vector, -39)); 18142841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org 18242841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(0.0, StrtodChar("0", 12345)); 18342841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(0.0, StrtodChar("", 1324)); 18442841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(0.0, StrtodChar("000000000", 123)); 18542841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(0.0, StrtodChar("2", -324)); 18642841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(4e-324, StrtodChar("3", -324)); 18742841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org // It would be more readable to put non-zero literals on the left side (i.e. 18842841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org // CHECK_EQ(1e-325, StrtodChar("1", -325))), but then Gcc complains that 18942841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org // they are truncated to zero. 19042841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(0.0, StrtodChar("1", -325)); 19142841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(0.0, StrtodChar("1", -325)); 19242841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(0.0, StrtodChar("20000", -328)); 19342841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(40000e-328, StrtodChar("30000", -328)); 19442841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(0.0, StrtodChar("10000", -329)); 19542841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(0.0, StrtodChar("90000", -329)); 19642841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(0.0, StrtodChar("000000001", -325)); 19742841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(0.0, StrtodChar("000000001", -325)); 19842841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(0.0, StrtodChar("0000000020000", -328)); 19942841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(40000e-328, StrtodChar("00000030000", -328)); 20042841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(0.0, StrtodChar("0000000010000", -329)); 20142841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(0.0, StrtodChar("0000000090000", -329)); 20242841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org 20342841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org // It would be more readable to put the literals (and not V8_INFINITY) on the 20442841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org // left side (i.e. CHECK_EQ(1e309, StrtodChar("1", 309))), but then Gcc 20542841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org // complains that the floating constant exceeds range of 'double'. 20642841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(V8_INFINITY, StrtodChar("1", 309)); 20742841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(1e308, StrtodChar("1", 308)); 20842841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(1234e305, StrtodChar("1234", 305)); 20942841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(1234e304, StrtodChar("1234", 304)); 21042841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(V8_INFINITY, StrtodChar("18", 307)); 21142841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(17e307, StrtodChar("17", 307)); 21242841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(V8_INFINITY, StrtodChar("0000001", 309)); 21342841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(1e308, StrtodChar("00000001", 308)); 21442841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(1234e305, StrtodChar("00000001234", 305)); 21542841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(1234e304, StrtodChar("000000001234", 304)); 21642841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(V8_INFINITY, StrtodChar("0000000018", 307)); 21742841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(17e307, StrtodChar("0000000017", 307)); 21842841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(V8_INFINITY, StrtodChar("1000000", 303)); 21942841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(1e308, StrtodChar("100000", 303)); 22042841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(1234e305, StrtodChar("123400000", 300)); 22142841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(1234e304, StrtodChar("123400000", 299)); 22242841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(V8_INFINITY, StrtodChar("180000000", 300)); 22342841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(17e307, StrtodChar("170000000", 300)); 22442841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(V8_INFINITY, StrtodChar("00000001000000", 303)); 22542841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(1e308, StrtodChar("000000000000100000", 303)); 22642841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(1234e305, StrtodChar("00000000123400000", 300)); 22742841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(1234e304, StrtodChar("0000000123400000", 299)); 22842841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(V8_INFINITY, StrtodChar("00000000180000000", 300)); 22942841968c3c92e3b07bcd67e79eb6ba3f83032c1vegorov@chromium.org CHECK_EQ(17e307, StrtodChar("00000000170000000", 300)); 230303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(1.7976931348623157E+308, StrtodChar("17976931348623157", 292)); 231303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(1.7976931348623158E+308, StrtodChar("17976931348623158", 292)); 232303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(V8_INFINITY, StrtodChar("17976931348623159", 292)); 2334a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org 23401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // The following number is the result of 89255.0/1e22. Both floating-point 2354a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org // numbers can be accurately represented with doubles. However on Linux,x86 2364a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org // the floating-point stack is set to 80bits and the double-rounding 2374a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org // introduces an error. 2384a5224e84636d192e82f288bfab0d308bdae5c37whesse@chromium.org CHECK_EQ(89255e-22, StrtodChar("89255", -22)); 23901fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 24001fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // Some random values. 24101fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CHECK_EQ(358416272e-33, StrtodChar("358416272", -33)); 242303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(104110013277974872254e-225, 243303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org StrtodChar("104110013277974872254", -225)); 244303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org 245303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(123456789e108, StrtodChar("123456789", 108)); 246303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(123456789e109, StrtodChar("123456789", 109)); 247303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(123456789e110, StrtodChar("123456789", 110)); 248303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(123456789e111, StrtodChar("123456789", 111)); 249303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(123456789e112, StrtodChar("123456789", 112)); 250303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(123456789e113, StrtodChar("123456789", 113)); 251303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(123456789e114, StrtodChar("123456789", 114)); 252303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(123456789e115, StrtodChar("123456789", 115)); 253303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org 254303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(1234567890123456789012345e108, 255303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org StrtodChar("1234567890123456789012345", 108)); 256303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(1234567890123456789012345e109, 257303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org StrtodChar("1234567890123456789012345", 109)); 258303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(1234567890123456789012345e110, 259303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org StrtodChar("1234567890123456789012345", 110)); 260303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(1234567890123456789012345e111, 261303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org StrtodChar("1234567890123456789012345", 111)); 262303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(1234567890123456789012345e112, 263303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org StrtodChar("1234567890123456789012345", 112)); 264303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(1234567890123456789012345e113, 265303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org StrtodChar("1234567890123456789012345", 113)); 266303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(1234567890123456789012345e114, 267303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org StrtodChar("1234567890123456789012345", 114)); 268303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(1234567890123456789012345e115, 269303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org StrtodChar("1234567890123456789012345", 115)); 270303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org 271303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(1234567890123456789052345e108, 272303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org StrtodChar("1234567890123456789052345", 108)); 273303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(1234567890123456789052345e109, 274303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org StrtodChar("1234567890123456789052345", 109)); 275303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(1234567890123456789052345e110, 276303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org StrtodChar("1234567890123456789052345", 110)); 277303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(1234567890123456789052345e111, 278303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org StrtodChar("1234567890123456789052345", 111)); 279303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(1234567890123456789052345e112, 280303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org StrtodChar("1234567890123456789052345", 112)); 281303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(1234567890123456789052345e113, 282303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org StrtodChar("1234567890123456789052345", 113)); 283303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(1234567890123456789052345e114, 284303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org StrtodChar("1234567890123456789052345", 114)); 285303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org CHECK_EQ(1234567890123456789052345e115, 286303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org StrtodChar("1234567890123456789052345", 115)); 28701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 2884a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com CHECK_EQ(5.445618932859895e-255, 2894a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com StrtodChar("5445618932859895362967233318697132813618813095743952975" 2904a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com "4392982234069699615600475529427176366709107287468930197" 2914a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com "8628345413991790019316974825934906752493984055268219809" 2924a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com "5012176093045431437495773903922425632551857520884625114" 2934a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com "6241265881735209066709685420744388526014389929047617597" 2944a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com "0302268848374508109029268898695825171158085457567481507" 2954a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com "4162979705098246243690189880319928315307816832576838178" 2964a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com "2563074014542859888710209237525873301724479666744537857" 2974a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com "9026553346649664045621387124193095870305991178772256504" 2984a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com "4368663670643970181259143319016472430928902201239474588" 2994a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com "1392338901353291306607057623202353588698746085415097902" 3004a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com "6640064319118728664842287477491068264828851624402189317" 3014a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com "2769161449825765517353755844373640588822904791244190695" 3024a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com "2998382932630754670573838138825217065450843010498555058" 3034a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com "88186560731", -1035)); 3044a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com 30501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // Boundary cases. Boundaries themselves should round to even. 30601fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // 30701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // 0x1FFFFFFFFFFFF * 2^3 = 72057594037927928 30801fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // next: 72057594037927936 30901fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // boundary: 72057594037927932 should round up. 31001fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CHECK_EQ(72057594037927928.0, StrtodChar("72057594037927928", 0)); 31101fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CHECK_EQ(72057594037927936.0, StrtodChar("72057594037927936", 0)); 31201fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CHECK_EQ(72057594037927936.0, StrtodChar("72057594037927932", 0)); 31301fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CHECK_EQ(72057594037927928.0, StrtodChar("7205759403792793199999", -5)); 31401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CHECK_EQ(72057594037927936.0, StrtodChar("7205759403792793200001", -5)); 31501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 31601fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // 0x1FFFFFFFFFFFF * 2^10 = 9223372036854774784 31701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // next: 9223372036854775808 31801fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // boundary: 9223372036854775296 should round up. 31901fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CHECK_EQ(9223372036854774784.0, StrtodChar("9223372036854774784", 0)); 32001fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CHECK_EQ(9223372036854775808.0, StrtodChar("9223372036854775808", 0)); 32101fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CHECK_EQ(9223372036854775808.0, StrtodChar("9223372036854775296", 0)); 32201fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CHECK_EQ(9223372036854774784.0, StrtodChar("922337203685477529599999", -5)); 32301fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CHECK_EQ(9223372036854775808.0, StrtodChar("922337203685477529600001", -5)); 32401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 32501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // 0x1FFFFFFFFFFFF * 2^50 = 10141204801825834086073718800384 32601fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // next: 10141204801825835211973625643008 32701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // boundary: 10141204801825834649023672221696 should round up. 32801fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CHECK_EQ(10141204801825834086073718800384.0, 32901fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org StrtodChar("10141204801825834086073718800384", 0)); 33001fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CHECK_EQ(10141204801825835211973625643008.0, 33101fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org StrtodChar("10141204801825835211973625643008", 0)); 33201fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CHECK_EQ(10141204801825835211973625643008.0, 33301fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org StrtodChar("10141204801825834649023672221696", 0)); 33401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CHECK_EQ(10141204801825834086073718800384.0, 33501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org StrtodChar("1014120480182583464902367222169599999", -5)); 33601fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CHECK_EQ(10141204801825835211973625643008.0, 33701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org StrtodChar("1014120480182583464902367222169600001", -5)); 33801fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 33901fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // 0x1FFFFFFFFFFFF * 2^99 = 5708990770823838890407843763683279797179383808 34001fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // next: 5708990770823839524233143877797980545530986496 34101fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // boundary: 5708990770823839207320493820740630171355185152 34201fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // The boundary should round up. 34301fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CHECK_EQ(5708990770823838890407843763683279797179383808.0, 34401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org StrtodChar("5708990770823838890407843763683279797179383808", 0)); 34501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CHECK_EQ(5708990770823839524233143877797980545530986496.0, 34601fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org StrtodChar("5708990770823839524233143877797980545530986496", 0)); 34701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CHECK_EQ(5708990770823839524233143877797980545530986496.0, 34801fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org StrtodChar("5708990770823839207320493820740630171355185152", 0)); 34901fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CHECK_EQ(5708990770823838890407843763683279797179383808.0, 35001fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org StrtodChar("5708990770823839207320493820740630171355185151999", -3)); 35101fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CHECK_EQ(5708990770823839524233143877797980545530986496.0, 35201fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org StrtodChar("5708990770823839207320493820740630171355185152001", -3)); 353d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com 354d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com // The following test-cases got some public attention in early 2011 when they 355d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com // sent Java and PHP into an infinite loop. 356d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com CHECK_EQ(2.225073858507201e-308, StrtodChar("22250738585072011", -324)); 357d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com CHECK_EQ(2.22507385850720138309e-308, 358d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com StrtodChar("22250738585072011360574097967091319759348195463516456480" 359d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com "23426109724822222021076945516529523908135087914149158913" 360d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com "03962110687008643869459464552765720740782062174337998814" 361d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com "10632673292535522868813721490129811224514518898490572223" 362d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com "07285255133155755015914397476397983411801999323962548289" 363d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com "01710708185069063066665599493827577257201576306269066333" 364d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com "26475653000092458883164330377797918696120494973903778297" 365d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com "04905051080609940730262937128958950003583799967207254304" 366d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com "36028407889577179615094551674824347103070260914462157228" 367d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com "98802581825451803257070188608721131280795122334262883686" 368d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com "22321503775666622503982534335974568884423900265498198385" 369d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com "48794829220689472168983109969836584681402285424333066033" 370d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com "98508864458040010349339704275671864433837704860378616227" 371d91075f76b836c2cfa4f4e4cc0fb31170df864ccerik.corry@gmail.com "71738545623065874679014086723327636718751", -1076)); 37201fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org} 37301fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 37401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 37501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.orgstatic int CompareBignumToDiyFp(const Bignum& bignum_digits, 37601fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org int bignum_exponent, 37701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org DiyFp diy_fp) { 37801fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org Bignum bignum; 37901fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org bignum.AssignBignum(bignum_digits); 38001fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org Bignum other; 38101fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org other.AssignUInt64(diy_fp.f()); 38201fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org if (bignum_exponent >= 0) { 38301fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org bignum.MultiplyByPowerOfTen(bignum_exponent); 38401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org } else { 38501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org other.MultiplyByPowerOfTen(-bignum_exponent); 38601fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org } 38701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org if (diy_fp.e() >= 0) { 38801fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org other.ShiftLeft(diy_fp.e()); 38901fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org } else { 39001fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org bignum.ShiftLeft(-diy_fp.e()); 39101fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org } 39201fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org return Bignum::Compare(bignum, other); 39301fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org} 39401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 39501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 39601fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.orgstatic bool CheckDouble(Vector<const char> buffer, 39701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org int exponent, 39801fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org double to_check) { 39901fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org DiyFp lower_boundary; 40001fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org DiyFp upper_boundary; 40101fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org Bignum input_digits; 40201fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org input_digits.AssignDecimalString(buffer); 40301fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org if (to_check == 0.0) { 40401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org const double kMinDouble = 4e-324; 40501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // Check that the buffer*10^exponent < (0 + kMinDouble)/2. 40601fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org Double d(kMinDouble); 40701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org d.NormalizedBoundaries(&lower_boundary, &upper_boundary); 40801fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org return CompareBignumToDiyFp(input_digits, exponent, lower_boundary) <= 0; 40901fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org } 41001fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org if (to_check == V8_INFINITY) { 41101fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org const double kMaxDouble = 1.7976931348623157e308; 41201fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // Check that the buffer*10^exponent >= boundary between kMaxDouble and inf. 41301fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org Double d(kMaxDouble); 41401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org d.NormalizedBoundaries(&lower_boundary, &upper_boundary); 41501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org return CompareBignumToDiyFp(input_digits, exponent, upper_boundary) >= 0; 41601fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org } 41701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org Double d(to_check); 41801fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org d.NormalizedBoundaries(&lower_boundary, &upper_boundary); 41901fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org if ((d.Significand() & 1) == 0) { 42001fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org return CompareBignumToDiyFp(input_digits, exponent, lower_boundary) >= 0 && 42101fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CompareBignumToDiyFp(input_digits, exponent, upper_boundary) <= 0; 42201fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org } else { 42301fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org return CompareBignumToDiyFp(input_digits, exponent, lower_boundary) > 0 && 42401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CompareBignumToDiyFp(input_digits, exponent, upper_boundary) < 0; 42501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org } 42601fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org} 42701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 42801fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 42901fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org// Copied from v8.cc and adapted to make the function deterministic. 43001fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.orgstatic uint32_t DeterministicRandom() { 43101fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // Random number generator using George Marsaglia's MWC algorithm. 43201fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org static uint32_t hi = 0; 43301fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org static uint32_t lo = 0; 43401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 43501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // Initialization values don't have any special meaning. (They are the result 436c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org // of two calls to rand().) 43701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org if (hi == 0) hi = 0xbfe166e7; 43801fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org if (lo == 0) lo = 0x64d1c3c9; 43901fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 44001fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org // Mix the bits. 44101fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org hi = 36969 * (hi & 0xFFFF) + (hi >> 16); 44201fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org lo = 18273 * (lo & 0xFFFF) + (lo >> 16); 44301fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org return (hi << 16) + (lo & 0xFFFF); 44401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org} 44501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 44601fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 44701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.orgstatic const int kBufferSize = 1024; 44801fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.orgstatic const int kShortStrtodRandomCount = 2; 44901fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.orgstatic const int kLargeStrtodRandomCount = 2; 45001fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org 45101fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.orgTEST(RandomStrtod) { 45204a34e6171ac922cb1a4c5162cf471809c468ad0machenbach@chromium.org RandomNumberGenerator rng; 45301fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org char buffer[kBufferSize]; 45401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org for (int length = 1; length < 15; length++) { 45501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org for (int i = 0; i < kShortStrtodRandomCount; ++i) { 45601fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org int pos = 0; 45701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org for (int j = 0; j < length; ++j) { 45804a34e6171ac922cb1a4c5162cf471809c468ad0machenbach@chromium.org buffer[pos++] = rng.NextInt(10) + '0'; 45901fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org } 46001fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org int exponent = DeterministicRandom() % (25*2 + 1) - 25 - length; 46101fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org buffer[pos] = '\0'; 46201fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org Vector<const char> vector(buffer, pos); 46301fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org double strtod_result = Strtod(vector, exponent); 46401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CHECK(CheckDouble(vector, exponent, strtod_result)); 46501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org } 46601fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org } 46701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org for (int length = 15; length < 800; length += 2) { 46801fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org for (int i = 0; i < kLargeStrtodRandomCount; ++i) { 46901fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org int pos = 0; 47001fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org for (int j = 0; j < length; ++j) { 47104a34e6171ac922cb1a4c5162cf471809c468ad0machenbach@chromium.org buffer[pos++] = rng.NextInt(10) + '0'; 47201fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org } 47301fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org int exponent = DeterministicRandom() % (308*2 + 1) - 308 - length; 47401fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org buffer[pos] = '\0'; 47501fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org Vector<const char> vector(buffer, pos); 47601fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org double strtod_result = Strtod(vector, exponent); 47701fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org CHECK(CheckDouble(vector, exponent, strtod_result)); 47801fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org } 47901fe7df37ce9858e3d0069ec6a2d7c667256b95aager@chromium.org } 480b61a0d13e9690ef4c2de424bbe82a38884d981a6ager@chromium.org} 481