1/* Locale-independent implementations of string <-> double conversions. */
2
3#include "jsi.h"
4
5#if defined(_MSC_VER) && (_MSC_VER < 1700) /* VS2012 has stdint.h */
6typedef unsigned int uint32_t;
7typedef unsigned __int64 uint64_t;
8#else
9#include <stdint.h>
10#endif
11
12#include <errno.h>
13#include <assert.h>
14
15#ifndef TRUE
16#define TRUE 1
17#define FALSE 0
18#endif
19
20/*
21 * format exponent like sprintf(p, "e%+d", e)
22 */
23void
24js_fmtexp(char *p, int e)
25{
26 char se[9];
27 int i;
28
29 *p++ = 'e';
30 if(e < 0) {
31 *p++ = '-';
32 e = -e;
33 } else
34 *p++ = '+';
35 i = 0;
36 while(e) {
37 se[i++] = e % 10 + '0';
38 e /= 10;
39 }
40 while(i < 1)
41 se[i++] = '0';
42 while(i > 0)
43 *p++ = se[--i];
44 *p++ = '\0';
45}
46
47/*
48 * grisu2_59_56.c
49 *
50 * Grisu prints the optimal decimal representation of floating-point numbers.
51 *
52 * Copyright (c) 2009 Florian Loitsch
53 *
54 * Permission is hereby granted, free of charge, to any person obtaining a copy
55 * of this software and associated documentation files (the "Software"), to
56 * deal in the Software without restriction, including without limitation the
57 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
58 * sell copies of the Software, and to permit persons to whom the Software is
59 * furnished to do so, subject to the following conditions:
60 *
61 * The above copyright notice and this permission notice shall be included in
62 * all copies or substantial portions of the Software.
63 *
64 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
65 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
66 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
67 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
68 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
69 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
70 * IN THE SOFTWARE.
71 */
72
73typedef struct diy_fp_t {
74 uint64_t f;
75 int e;
76} diy_fp_t;
77
78#define DIY_SIGNIFICAND_SIZE 64
79#define D_1_LOG2_10 0.30102999566398114 /* 1 / lg(10) */
80
81static const uint64_t powers_ten[] = {
82 0xbf29dcaba82fdeae, 0xeef453d6923bd65a, 0x9558b4661b6565f8,
83 0xbaaee17fa23ebf76, 0xe95a99df8ace6f54, 0x91d8a02bb6c10594,
84 0xb64ec836a47146fa, 0xe3e27a444d8d98b8, 0x8e6d8c6ab0787f73,
85 0xb208ef855c969f50, 0xde8b2b66b3bc4724, 0x8b16fb203055ac76,
86 0xaddcb9e83c6b1794, 0xd953e8624b85dd79, 0x87d4713d6f33aa6c,
87 0xa9c98d8ccb009506, 0xd43bf0effdc0ba48, 0x84a57695fe98746d,
88 0xa5ced43b7e3e9188, 0xcf42894a5dce35ea, 0x818995ce7aa0e1b2,
89 0xa1ebfb4219491a1f, 0xca66fa129f9b60a7, 0xfd00b897478238d1,
90 0x9e20735e8cb16382, 0xc5a890362fddbc63, 0xf712b443bbd52b7c,
91 0x9a6bb0aa55653b2d, 0xc1069cd4eabe89f9, 0xf148440a256e2c77,
92 0x96cd2a865764dbca, 0xbc807527ed3e12bd, 0xeba09271e88d976c,
93 0x93445b8731587ea3, 0xb8157268fdae9e4c, 0xe61acf033d1a45df,
94 0x8fd0c16206306bac, 0xb3c4f1ba87bc8697, 0xe0b62e2929aba83c,
95 0x8c71dcd9ba0b4926, 0xaf8e5410288e1b6f, 0xdb71e91432b1a24b,
96 0x892731ac9faf056f, 0xab70fe17c79ac6ca, 0xd64d3d9db981787d,
97 0x85f0468293f0eb4e, 0xa76c582338ed2622, 0xd1476e2c07286faa,
98 0x82cca4db847945ca, 0xa37fce126597973d, 0xcc5fc196fefd7d0c,
99 0xff77b1fcbebcdc4f, 0x9faacf3df73609b1, 0xc795830d75038c1e,
100 0xf97ae3d0d2446f25, 0x9becce62836ac577, 0xc2e801fb244576d5,
101 0xf3a20279ed56d48a, 0x9845418c345644d7, 0xbe5691ef416bd60c,
102 0xedec366b11c6cb8f, 0x94b3a202eb1c3f39, 0xb9e08a83a5e34f08,
103 0xe858ad248f5c22ca, 0x91376c36d99995be, 0xb58547448ffffb2e,
104 0xe2e69915b3fff9f9, 0x8dd01fad907ffc3c, 0xb1442798f49ffb4b,
105 0xdd95317f31c7fa1d, 0x8a7d3eef7f1cfc52, 0xad1c8eab5ee43b67,
106 0xd863b256369d4a41, 0x873e4f75e2224e68, 0xa90de3535aaae202,
107 0xd3515c2831559a83, 0x8412d9991ed58092, 0xa5178fff668ae0b6,
108 0xce5d73ff402d98e4, 0x80fa687f881c7f8e, 0xa139029f6a239f72,
109 0xc987434744ac874f, 0xfbe9141915d7a922, 0x9d71ac8fada6c9b5,
110 0xc4ce17b399107c23, 0xf6019da07f549b2b, 0x99c102844f94e0fb,
111 0xc0314325637a193a, 0xf03d93eebc589f88, 0x96267c7535b763b5,
112 0xbbb01b9283253ca3, 0xea9c227723ee8bcb, 0x92a1958a7675175f,
113 0xb749faed14125d37, 0xe51c79a85916f485, 0x8f31cc0937ae58d3,
114 0xb2fe3f0b8599ef08, 0xdfbdcece67006ac9, 0x8bd6a141006042be,
115 0xaecc49914078536d, 0xda7f5bf590966849, 0x888f99797a5e012d,
116 0xaab37fd7d8f58179, 0xd5605fcdcf32e1d7, 0x855c3be0a17fcd26,
117 0xa6b34ad8c9dfc070, 0xd0601d8efc57b08c, 0x823c12795db6ce57,
118 0xa2cb1717b52481ed, 0xcb7ddcdda26da269, 0xfe5d54150b090b03,
119 0x9efa548d26e5a6e2, 0xc6b8e9b0709f109a, 0xf867241c8cc6d4c1,
120 0x9b407691d7fc44f8, 0xc21094364dfb5637, 0xf294b943e17a2bc4,
121 0x979cf3ca6cec5b5b, 0xbd8430bd08277231, 0xece53cec4a314ebe,
122 0x940f4613ae5ed137, 0xb913179899f68584, 0xe757dd7ec07426e5,
123 0x9096ea6f3848984f, 0xb4bca50b065abe63, 0xe1ebce4dc7f16dfc,
124 0x8d3360f09cf6e4bd, 0xb080392cc4349ded, 0xdca04777f541c568,
125 0x89e42caaf9491b61, 0xac5d37d5b79b6239, 0xd77485cb25823ac7,
126 0x86a8d39ef77164bd, 0xa8530886b54dbdec, 0xd267caa862a12d67,
127 0x8380dea93da4bc60, 0xa46116538d0deb78, 0xcd795be870516656,
128 0x806bd9714632dff6, 0xa086cfcd97bf97f4, 0xc8a883c0fdaf7df0,
129 0xfad2a4b13d1b5d6c, 0x9cc3a6eec6311a64, 0xc3f490aa77bd60fd,
130 0xf4f1b4d515acb93c, 0x991711052d8bf3c5, 0xbf5cd54678eef0b7,
131 0xef340a98172aace5, 0x9580869f0e7aac0f, 0xbae0a846d2195713,
132 0xe998d258869facd7, 0x91ff83775423cc06, 0xb67f6455292cbf08,
133 0xe41f3d6a7377eeca, 0x8e938662882af53e, 0xb23867fb2a35b28e,
134 0xdec681f9f4c31f31, 0x8b3c113c38f9f37f, 0xae0b158b4738705f,
135 0xd98ddaee19068c76, 0x87f8a8d4cfa417ca, 0xa9f6d30a038d1dbc,
136 0xd47487cc8470652b, 0x84c8d4dfd2c63f3b, 0xa5fb0a17c777cf0a,
137 0xcf79cc9db955c2cc, 0x81ac1fe293d599c0, 0xa21727db38cb0030,
138 0xca9cf1d206fdc03c, 0xfd442e4688bd304b, 0x9e4a9cec15763e2f,
139 0xc5dd44271ad3cdba, 0xf7549530e188c129, 0x9a94dd3e8cf578ba,
140 0xc13a148e3032d6e8, 0xf18899b1bc3f8ca2, 0x96f5600f15a7b7e5,
141 0xbcb2b812db11a5de, 0xebdf661791d60f56, 0x936b9fcebb25c996,
142 0xb84687c269ef3bfb, 0xe65829b3046b0afa, 0x8ff71a0fe2c2e6dc,
143 0xb3f4e093db73a093, 0xe0f218b8d25088b8, 0x8c974f7383725573,
144 0xafbd2350644eead0, 0xdbac6c247d62a584, 0x894bc396ce5da772,
145 0xab9eb47c81f5114f, 0xd686619ba27255a3, 0x8613fd0145877586,
146 0xa798fc4196e952e7, 0xd17f3b51fca3a7a1, 0x82ef85133de648c5,
147 0xa3ab66580d5fdaf6, 0xcc963fee10b7d1b3, 0xffbbcfe994e5c620,
148 0x9fd561f1fd0f9bd4, 0xc7caba6e7c5382c9, 0xf9bd690a1b68637b,
149 0x9c1661a651213e2d, 0xc31bfa0fe5698db8, 0xf3e2f893dec3f126,
150 0x986ddb5c6b3a76b8, 0xbe89523386091466, 0xee2ba6c0678b597f,
151 0x94db483840b717f0, 0xba121a4650e4ddec, 0xe896a0d7e51e1566,
152 0x915e2486ef32cd60, 0xb5b5ada8aaff80b8, 0xe3231912d5bf60e6,
153 0x8df5efabc5979c90, 0xb1736b96b6fd83b4, 0xddd0467c64bce4a1,
154 0x8aa22c0dbef60ee4, 0xad4ab7112eb3929e, 0xd89d64d57a607745,
155 0x87625f056c7c4a8b, 0xa93af6c6c79b5d2e, 0xd389b47879823479,
156 0x843610cb4bf160cc, 0xa54394fe1eedb8ff, 0xce947a3da6a9273e,
157 0x811ccc668829b887, 0xa163ff802a3426a9, 0xc9bcff6034c13053,
158 0xfc2c3f3841f17c68, 0x9d9ba7832936edc1, 0xc5029163f384a931,
159 0xf64335bcf065d37d, 0x99ea0196163fa42e, 0xc06481fb9bcf8d3a,
160 0xf07da27a82c37088, 0x964e858c91ba2655, 0xbbe226efb628afeb,
161 0xeadab0aba3b2dbe5, 0x92c8ae6b464fc96f, 0xb77ada0617e3bbcb,
162 0xe55990879ddcaabe, 0x8f57fa54c2a9eab7, 0xb32df8e9f3546564,
163 0xdff9772470297ebd, 0x8bfbea76c619ef36, 0xaefae51477a06b04,
164 0xdab99e59958885c5, 0x88b402f7fd75539b, 0xaae103b5fcd2a882,
165 0xd59944a37c0752a2, 0x857fcae62d8493a5, 0xa6dfbd9fb8e5b88f,
166 0xd097ad07a71f26b2, 0x825ecc24c8737830, 0xa2f67f2dfa90563b,
167 0xcbb41ef979346bca, 0xfea126b7d78186bd, 0x9f24b832e6b0f436,
168 0xc6ede63fa05d3144, 0xf8a95fcf88747d94, 0x9b69dbe1b548ce7d,
169 0xc24452da229b021c, 0xf2d56790ab41c2a3, 0x97c560ba6b0919a6,
170 0xbdb6b8e905cb600f, 0xed246723473e3813, 0x9436c0760c86e30c,
171 0xb94470938fa89bcf, 0xe7958cb87392c2c3, 0x90bd77f3483bb9ba,
172 0xb4ecd5f01a4aa828, 0xe2280b6c20dd5232, 0x8d590723948a535f,
173 0xb0af48ec79ace837, 0xdcdb1b2798182245, 0x8a08f0f8bf0f156b,
174 0xac8b2d36eed2dac6, 0xd7adf884aa879177, 0x86ccbb52ea94baeb,
175 0xa87fea27a539e9a5, 0xd29fe4b18e88640f, 0x83a3eeeef9153e89,
176 0xa48ceaaab75a8e2b, 0xcdb02555653131b6, 0x808e17555f3ebf12,
177 0xa0b19d2ab70e6ed6, 0xc8de047564d20a8c, 0xfb158592be068d2f,
178 0x9ced737bb6c4183d, 0xc428d05aa4751e4d, 0xf53304714d9265e0,
179 0x993fe2c6d07b7fac, 0xbf8fdb78849a5f97, 0xef73d256a5c0f77d,
180 0x95a8637627989aae, 0xbb127c53b17ec159, 0xe9d71b689dde71b0,
181 0x9226712162ab070e, 0xb6b00d69bb55c8d1, 0xe45c10c42a2b3b06,
182 0x8eb98a7a9a5b04e3, 0xb267ed1940f1c61c, 0xdf01e85f912e37a3,
183 0x8b61313bbabce2c6, 0xae397d8aa96c1b78, 0xd9c7dced53c72256,
184 0x881cea14545c7575, 0xaa242499697392d3, 0xd4ad2dbfc3d07788,
185 0x84ec3c97da624ab5, 0xa6274bbdd0fadd62, 0xcfb11ead453994ba,
186 0x81ceb32c4b43fcf5, 0xa2425ff75e14fc32, 0xcad2f7f5359a3b3e,
187 0xfd87b5f28300ca0e, 0x9e74d1b791e07e48, 0xc612062576589ddb,
188 0xf79687aed3eec551, 0x9abe14cd44753b53, 0xc16d9a0095928a27,
189 0xf1c90080baf72cb1, 0x971da05074da7bef, 0xbce5086492111aeb,
190 0xec1e4a7db69561a5, 0x9392ee8e921d5d07, 0xb877aa3236a4b449,
191 0xe69594bec44de15b, 0x901d7cf73ab0acd9, 0xb424dc35095cd80f,
192 0xe12e13424bb40e13, 0x8cbccc096f5088cc, 0xafebff0bcb24aaff,
193 0xdbe6fecebdedd5bf, 0x89705f4136b4a597, 0xabcc77118461cefd,
194 0xd6bf94d5e57a42bc, 0x8637bd05af6c69b6, 0xa7c5ac471b478423,
195 0xd1b71758e219652c, 0x83126e978d4fdf3b, 0xa3d70a3d70a3d70a,
196 0xcccccccccccccccd, 0x8000000000000000, 0xa000000000000000,
197 0xc800000000000000, 0xfa00000000000000, 0x9c40000000000000,
198 0xc350000000000000, 0xf424000000000000, 0x9896800000000000,
199 0xbebc200000000000, 0xee6b280000000000, 0x9502f90000000000,
200 0xba43b74000000000, 0xe8d4a51000000000, 0x9184e72a00000000,
201 0xb5e620f480000000, 0xe35fa931a0000000, 0x8e1bc9bf04000000,
202 0xb1a2bc2ec5000000, 0xde0b6b3a76400000, 0x8ac7230489e80000,
203 0xad78ebc5ac620000, 0xd8d726b7177a8000, 0x878678326eac9000,
204 0xa968163f0a57b400, 0xd3c21bcecceda100, 0x84595161401484a0,
205 0xa56fa5b99019a5c8, 0xcecb8f27f4200f3a, 0x813f3978f8940984,
206 0xa18f07d736b90be5, 0xc9f2c9cd04674edf, 0xfc6f7c4045812296,
207 0x9dc5ada82b70b59e, 0xc5371912364ce305, 0xf684df56c3e01bc7,
208 0x9a130b963a6c115c, 0xc097ce7bc90715b3, 0xf0bdc21abb48db20,
209 0x96769950b50d88f4, 0xbc143fa4e250eb31, 0xeb194f8e1ae525fd,
210 0x92efd1b8d0cf37be, 0xb7abc627050305ae, 0xe596b7b0c643c719,
211 0x8f7e32ce7bea5c70, 0xb35dbf821ae4f38c, 0xe0352f62a19e306f,
212 0x8c213d9da502de45, 0xaf298d050e4395d7, 0xdaf3f04651d47b4c,
213 0x88d8762bf324cd10, 0xab0e93b6efee0054, 0xd5d238a4abe98068,
214 0x85a36366eb71f041, 0xa70c3c40a64e6c52, 0xd0cf4b50cfe20766,
215 0x82818f1281ed44a0, 0xa321f2d7226895c8, 0xcbea6f8ceb02bb3a,
216 0xfee50b7025c36a08, 0x9f4f2726179a2245, 0xc722f0ef9d80aad6,
217 0xf8ebad2b84e0d58c, 0x9b934c3b330c8577, 0xc2781f49ffcfa6d5,
218 0xf316271c7fc3908b, 0x97edd871cfda3a57, 0xbde94e8e43d0c8ec,
219 0xed63a231d4c4fb27, 0x945e455f24fb1cf9, 0xb975d6b6ee39e437,
220 0xe7d34c64a9c85d44, 0x90e40fbeea1d3a4b, 0xb51d13aea4a488dd,
221 0xe264589a4dcdab15, 0x8d7eb76070a08aed, 0xb0de65388cc8ada8,
222 0xdd15fe86affad912, 0x8a2dbf142dfcc7ab, 0xacb92ed9397bf996,
223 0xd7e77a8f87daf7fc, 0x86f0ac99b4e8dafd, 0xa8acd7c0222311bd,
224 0xd2d80db02aabd62c, 0x83c7088e1aab65db, 0xa4b8cab1a1563f52,
225 0xcde6fd5e09abcf27, 0x80b05e5ac60b6178, 0xa0dc75f1778e39d6,
226 0xc913936dd571c84c, 0xfb5878494ace3a5f, 0x9d174b2dcec0e47b,
227 0xc45d1df942711d9a, 0xf5746577930d6501, 0x9968bf6abbe85f20,
228 0xbfc2ef456ae276e9, 0xefb3ab16c59b14a3, 0x95d04aee3b80ece6,
229 0xbb445da9ca61281f, 0xea1575143cf97227, 0x924d692ca61be758,
230 0xb6e0c377cfa2e12e, 0xe498f455c38b997a, 0x8edf98b59a373fec,
231 0xb2977ee300c50fe7, 0xdf3d5e9bc0f653e1, 0x8b865b215899f46d,
232 0xae67f1e9aec07188, 0xda01ee641a708dea, 0x884134fe908658b2,
233 0xaa51823e34a7eedf, 0xd4e5e2cdc1d1ea96, 0x850fadc09923329e,
234 0xa6539930bf6bff46, 0xcfe87f7cef46ff17, 0x81f14fae158c5f6e,
235 0xa26da3999aef774a, 0xcb090c8001ab551c, 0xfdcb4fa002162a63,
236 0x9e9f11c4014dda7e, 0xc646d63501a1511e, 0xf7d88bc24209a565,
237 0x9ae757596946075f, 0xc1a12d2fc3978937, 0xf209787bb47d6b85,
238 0x9745eb4d50ce6333, 0xbd176620a501fc00, 0xec5d3fa8ce427b00,
239 0x93ba47c980e98ce0, 0xb8a8d9bbe123f018, 0xe6d3102ad96cec1e,
240 0x9043ea1ac7e41393, 0xb454e4a179dd1877, 0xe16a1dc9d8545e95,
241 0x8ce2529e2734bb1d, 0xb01ae745b101e9e4, 0xdc21a1171d42645d,
242 0x899504ae72497eba, 0xabfa45da0edbde69, 0xd6f8d7509292d603,
243 0x865b86925b9bc5c2, 0xa7f26836f282b733, 0xd1ef0244af2364ff,
244 0x8335616aed761f1f, 0xa402b9c5a8d3a6e7, 0xcd036837130890a1,
245 0x802221226be55a65, 0xa02aa96b06deb0fe, 0xc83553c5c8965d3d,
246 0xfa42a8b73abbf48d, 0x9c69a97284b578d8, 0xc38413cf25e2d70e,
247 0xf46518c2ef5b8cd1, 0x98bf2f79d5993803, 0xbeeefb584aff8604,
248 0xeeaaba2e5dbf6785, 0x952ab45cfa97a0b3, 0xba756174393d88e0,
249 0xe912b9d1478ceb17, 0x91abb422ccb812ef, 0xb616a12b7fe617aa,
250 0xe39c49765fdf9d95, 0x8e41ade9fbebc27d, 0xb1d219647ae6b31c,
251 0xde469fbd99a05fe3, 0x8aec23d680043bee, 0xada72ccc20054aea,
252 0xd910f7ff28069da4, 0x87aa9aff79042287, 0xa99541bf57452b28,
253 0xd3fa922f2d1675f2, 0x847c9b5d7c2e09b7, 0xa59bc234db398c25,
254 0xcf02b2c21207ef2f, 0x8161afb94b44f57d, 0xa1ba1ba79e1632dc,
255 0xca28a291859bbf93, 0xfcb2cb35e702af78, 0x9defbf01b061adab,
256 0xc56baec21c7a1916, 0xf6c69a72a3989f5c, 0x9a3c2087a63f6399,
257 0xc0cb28a98fcf3c80, 0xf0fdf2d3f3c30b9f, 0x969eb7c47859e744,
258 0xbc4665b596706115, 0xeb57ff22fc0c795a, 0x9316ff75dd87cbd8,
259 0xb7dcbf5354e9bece, 0xe5d3ef282a242e82, 0x8fa475791a569d11,
260 0xb38d92d760ec4455, 0xe070f78d3927556b, 0x8c469ab843b89563,
261 0xaf58416654a6babb, 0xdb2e51bfe9d0696a, 0x88fcf317f22241e2,
262 0xab3c2fddeeaad25b, 0xd60b3bd56a5586f2, 0x85c7056562757457,
263 0xa738c6bebb12d16d, 0xd106f86e69d785c8, 0x82a45b450226b39d,
264 0xa34d721642b06084, 0xcc20ce9bd35c78a5, 0xff290242c83396ce,
265 0x9f79a169bd203e41, 0xc75809c42c684dd1, 0xf92e0c3537826146,
266 0x9bbcc7a142b17ccc, 0xc2abf989935ddbfe, 0xf356f7ebf83552fe,
267 0x98165af37b2153df, 0xbe1bf1b059e9a8d6, 0xeda2ee1c7064130c,
268 0x9485d4d1c63e8be8, 0xb9a74a0637ce2ee1, 0xe8111c87c5c1ba9a,
269 0x910ab1d4db9914a0, 0xb54d5e4a127f59c8, 0xe2a0b5dc971f303a,
270 0x8da471a9de737e24, 0xb10d8e1456105dad, 0xdd50f1996b947519,
271 0x8a5296ffe33cc930, 0xace73cbfdc0bfb7b, 0xd8210befd30efa5a,
272 0x8714a775e3e95c78, 0xa8d9d1535ce3b396, 0xd31045a8341ca07c,
273 0x83ea2b892091e44e, 0xa4e4b66b68b65d61, 0xce1de40642e3f4b9,
274 0x80d2ae83e9ce78f4, 0xa1075a24e4421731, 0xc94930ae1d529cfd,
275 0xfb9b7cd9a4a7443c, 0x9d412e0806e88aa6, 0xc491798a08a2ad4f,
276 0xf5b5d7ec8acb58a3, 0x9991a6f3d6bf1766, 0xbff610b0cc6edd3f,
277 0xeff394dcff8a948f, 0x95f83d0a1fb69cd9, 0xbb764c4ca7a44410,
278 0xea53df5fd18d5514, 0x92746b9be2f8552c, 0xb7118682dbb66a77,
279 0xe4d5e82392a40515, 0x8f05b1163ba6832d, 0xb2c71d5bca9023f8,
280 0xdf78e4b2bd342cf7, 0x8bab8eefb6409c1a, 0xae9672aba3d0c321,
281 0xda3c0f568cc4f3e9, 0x8865899617fb1871, 0xaa7eebfb9df9de8e,
282 0xd51ea6fa85785631, 0x8533285c936b35df, 0xa67ff273b8460357,
283 0xd01fef10a657842c, 0x8213f56a67f6b29c, 0xa298f2c501f45f43,
284 0xcb3f2f7642717713, 0xfe0efb53d30dd4d8, 0x9ec95d1463e8a507,
285 0xc67bb4597ce2ce49, 0xf81aa16fdc1b81db, 0x9b10a4e5e9913129,
286 0xc1d4ce1f63f57d73, 0xf24a01a73cf2dcd0, 0x976e41088617ca02,
287 0xbd49d14aa79dbc82, 0xec9c459d51852ba3, 0x93e1ab8252f33b46,
288 0xb8da1662e7b00a17, 0xe7109bfba19c0c9d, 0x906a617d450187e2,
289 0xb484f9dc9641e9db, 0xe1a63853bbd26451, 0x8d07e33455637eb3,
290 0xb049dc016abc5e60, 0xdc5c5301c56b75f7, 0x89b9b3e11b6329bb,
291 0xac2820d9623bf429, 0xd732290fbacaf134, 0x867f59a9d4bed6c0,
292 0xa81f301449ee8c70, 0xd226fc195c6a2f8c, 0x83585d8fd9c25db8,
293 0xa42e74f3d032f526, 0xcd3a1230c43fb26f, 0x80444b5e7aa7cf85,
294 0xa0555e361951c367, 0xc86ab5c39fa63441, 0xfa856334878fc151,
295 0x9c935e00d4b9d8d2, 0xc3b8358109e84f07, 0xf4a642e14c6262c9,
296 0x98e7e9cccfbd7dbe, 0xbf21e44003acdd2d, 0xeeea5d5004981478,
297 0x95527a5202df0ccb, 0xbaa718e68396cffe, 0xe950df20247c83fd,
298 0x91d28b7416cdd27e, 0xb6472e511c81471e, 0xe3d8f9e563a198e5,
299 0x8e679c2f5e44ff8f, 0xb201833b35d63f73, 0xde81e40a034bcf50,
300 0x8b112e86420f6192, 0xadd57a27d29339f6, 0xd94ad8b1c7380874,
301 0x87cec76f1c830549, 0xa9c2794ae3a3c69b, 0xd433179d9c8cb841,
302 0x849feec281d7f329, 0xa5c7ea73224deff3, 0xcf39e50feae16bf0,
303 0x81842f29f2cce376, 0xa1e53af46f801c53, 0xca5e89b18b602368,
304 0xfcf62c1dee382c42, 0x9e19db92b4e31ba9, 0xc5a05277621be294,
305 0xf70867153aa2db39, 0x9a65406d44a5c903, 0xc0fe908895cf3b44,
306 0xf13e34aabb430a15, 0x96c6e0eab509e64d, 0xbc789925624c5fe1,
307 0xeb96bf6ebadf77d9, 0x933e37a534cbaae8, 0xb80dc58e81fe95a1,
308 0xe61136f2227e3b0a, 0x8fcac257558ee4e6, 0xb3bd72ed2af29e20,
309 0xe0accfa875af45a8, 0x8c6c01c9498d8b89, 0xaf87023b9bf0ee6b,
310 0xdb68c2ca82ed2a06, 0x892179be91d43a44, 0xab69d82e364948d4
311};
312
313static const int powers_ten_e[] = {
314 -1203, -1200, -1196, -1193, -1190, -1186, -1183, -1180, -1176, -1173,
315 -1170, -1166, -1163, -1160, -1156, -1153, -1150, -1146, -1143, -1140,
316 -1136, -1133, -1130, -1127, -1123, -1120, -1117, -1113, -1110, -1107,
317 -1103, -1100, -1097, -1093, -1090, -1087, -1083, -1080, -1077, -1073,
318 -1070, -1067, -1063, -1060, -1057, -1053, -1050, -1047, -1043, -1040,
319 -1037, -1034, -1030, -1027, -1024, -1020, -1017, -1014, -1010, -1007,
320 -1004, -1000, -997, -994, -990, -987, -984, -980, -977, -974, -970,
321 -967, -964, -960, -957, -954, -950, -947, -944, -940, -937, -934, -931,
322 -927, -924, -921, -917, -914, -911, -907, -904, -901, -897, -894, -891,
323 -887, -884, -881, -877, -874, -871, -867, -864, -861, -857, -854, -851,
324 -847, -844, -841, -838, -834, -831, -828, -824, -821, -818, -814, -811,
325 -808, -804, -801, -798, -794, -791, -788, -784, -781, -778, -774, -771,
326 -768, -764, -761, -758, -754, -751, -748, -744, -741, -738, -735, -731,
327 -728, -725, -721, -718, -715, -711, -708, -705, -701, -698, -695, -691,
328 -688, -685, -681, -678, -675, -671, -668, -665, -661, -658, -655, -651,
329 -648, -645, -642, -638, -635, -632, -628, -625, -622, -618, -615, -612,
330 -608, -605, -602, -598, -595, -592, -588, -585, -582, -578, -575, -572,
331 -568, -565, -562, -558, -555, -552, -549, -545, -542, -539, -535, -532,
332 -529, -525, -522, -519, -515, -512, -509, -505, -502, -499, -495, -492,
333 -489, -485, -482, -479, -475, -472, -469, -465, -462, -459, -455, -452,
334 -449, -446, -442, -439, -436, -432, -429, -426, -422, -419, -416, -412,
335 -409, -406, -402, -399, -396, -392, -389, -386, -382, -379, -376, -372,
336 -369, -366, -362, -359, -356, -353, -349, -346, -343, -339, -336, -333,
337 -329, -326, -323, -319, -316, -313, -309, -306, -303, -299, -296, -293,
338 -289, -286, -283, -279, -276, -273, -269, -266, -263, -259, -256, -253,
339 -250, -246, -243, -240, -236, -233, -230, -226, -223, -220, -216, -213,
340 -210, -206, -203, -200, -196, -193, -190, -186, -183, -180, -176, -173,
341 -170, -166, -163, -160, -157, -153, -150, -147, -143, -140, -137, -133,
342 -130, -127, -123, -120, -117, -113, -110, -107, -103, -100, -97, -93,
343 -90, -87, -83, -80, -77, -73, -70, -67, -63, -60, -57, -54, -50, -47,
344 -44, -40, -37, -34, -30, -27, -24, -20, -17, -14, -10, -7, -4, 0, 3, 6,
345 10, 13, 16, 20, 23, 26, 30, 33, 36, 39, 43, 46, 49, 53, 56, 59, 63, 66,
346 69, 73, 76, 79, 83, 86, 89, 93, 96, 99, 103, 106, 109, 113, 116, 119,
347 123, 126, 129, 132, 136, 139, 142, 146, 149, 152, 156, 159, 162, 166,
348 169, 172, 176, 179, 182, 186, 189, 192, 196, 199, 202, 206, 209, 212,
349 216, 219, 222, 226, 229, 232, 235, 239, 242, 245, 249, 252, 255, 259,
350 262, 265, 269, 272, 275, 279, 282, 285, 289, 292, 295, 299, 302, 305,
351 309, 312, 315, 319, 322, 325, 328, 332, 335, 338, 342, 345, 348, 352,
352 355, 358, 362, 365, 368, 372, 375, 378, 382, 385, 388, 392, 395, 398,
353 402, 405, 408, 412, 415, 418, 422, 425, 428, 431, 435, 438, 441, 445,
354 448, 451, 455, 458, 461, 465, 468, 471, 475, 478, 481, 485, 488, 491,
355 495, 498, 501, 505, 508, 511, 515, 518, 521, 524, 528, 531, 534, 538,
356 541, 544, 548, 551, 554, 558, 561, 564, 568, 571, 574, 578, 581, 584,
357 588, 591, 594, 598, 601, 604, 608, 611, 614, 617, 621, 624, 627, 631,
358 634, 637, 641, 644, 647, 651, 654, 657, 661, 664, 667, 671, 674, 677,
359 681, 684, 687, 691, 694, 697, 701, 704, 707, 711, 714, 717, 720, 724,
360 727, 730, 734, 737, 740, 744, 747, 750, 754, 757, 760, 764, 767, 770,
361 774, 777, 780, 784, 787, 790, 794, 797, 800, 804, 807, 810, 813, 817,
362 820, 823, 827, 830, 833, 837, 840, 843, 847, 850, 853, 857, 860, 863,
363 867, 870, 873, 877, 880, 883, 887, 890, 893, 897, 900, 903, 907, 910,
364 913, 916, 920, 923, 926, 930, 933, 936, 940, 943, 946, 950, 953, 956,
365 960, 963, 966, 970, 973, 976, 980, 983, 986, 990, 993, 996, 1000, 1003,
366 1006, 1009, 1013, 1016, 1019, 1023, 1026, 1029, 1033, 1036, 1039, 1043,
367 1046, 1049, 1053, 1056, 1059, 1063, 1066, 1069, 1073, 1076
368};
369
370static diy_fp_t cached_power(int k)
371{
372 diy_fp_t res;
373 int index = 343 + k;
374 res.f = powers_ten[index];
375 res.e = powers_ten_e[index];
376 return res;
377}
378
379static int k_comp(int e, int alpha, int gamma) {
380 return ceil((alpha-e+63) * D_1_LOG2_10);
381}
382
383static diy_fp_t minus(diy_fp_t x, diy_fp_t y)
384{
385 diy_fp_t r;
386 assert(x.e == y.e);
387 assert(x.f >= y.f);
388 r.f = x.f - y.f;
389 r.e = x.e;
390 return r;
391}
392
393static diy_fp_t multiply(diy_fp_t x, diy_fp_t y)
394{
395 uint64_t a,b,c,d,ac,bc,ad,bd,tmp;
396 diy_fp_t r;
397 uint64_t M32 = 0xFFFFFFFF;
398 a = x.f >> 32; b = x.f & M32;
399 c = y.f >> 32; d = y.f & M32;
400 ac = a*c; bc = b*c; ad = a*d; bd = b*d;
401 tmp = (bd>>32) + (ad&M32) + (bc&M32);
402 tmp += 1U << 31;
403 r.f = ac+(ad>>32)+(bc>>32)+(tmp >>32);
404 r.e = x.e + y.e + 64;
405 return r;
406}
407
408static uint64_t double_to_uint64(double d)
409{
410 uint64_t n;
411 memcpy(&n, &d, 8);
412 return n;
413}
414
415#define DP_SIGNIFICAND_SIZE 52
416#define DP_EXPONENT_BIAS (0x3FF + DP_SIGNIFICAND_SIZE)
417#define DP_MIN_EXPONENT (-DP_EXPONENT_BIAS)
418#define DP_EXPONENT_MASK 0x7FF0000000000000
419#define DP_SIGNIFICAND_MASK 0x000FFFFFFFFFFFFF
420#define DP_HIDDEN_BIT 0x0010000000000000
421
422static diy_fp_t double2diy_fp(double d)
423{
424 uint64_t d64 = double_to_uint64(d);
425 int biased_e = (d64 & DP_EXPONENT_MASK) >> DP_SIGNIFICAND_SIZE;
426 uint64_t significand = (d64 & DP_SIGNIFICAND_MASK);
427 diy_fp_t res;
428 if (biased_e != 0) {
429 res.f = significand + DP_HIDDEN_BIT;
430 res.e = biased_e - DP_EXPONENT_BIAS;
431 } else {
432 res.f = significand;
433 res.e = DP_MIN_EXPONENT + 1;
434 }
435 return res;
436}
437
438static diy_fp_t normalize_boundary(diy_fp_t in)
439{
440 diy_fp_t res = in;
441 /* Normalize now */
442 /* the original number could have been a denormal. */
443 while (! (res.f & (DP_HIDDEN_BIT << 1))) {
444 res.f <<= 1;
445 res.e--;
446 }
447 /* do the final shifts in one go. Don't forget the hidden bit (the '-1') */
448 res.f <<= (DIY_SIGNIFICAND_SIZE - DP_SIGNIFICAND_SIZE - 2);
449 res.e = res.e - (DIY_SIGNIFICAND_SIZE - DP_SIGNIFICAND_SIZE - 2);
450 return res;
451}
452
453static void normalized_boundaries(double d, diy_fp_t* out_m_minus, diy_fp_t* out_m_plus)
454{
455 diy_fp_t v = double2diy_fp(d);
456 diy_fp_t pl, mi;
457 int significand_is_zero = v.f == DP_HIDDEN_BIT;
458 pl.f = (v.f << 1) + 1; pl.e = v.e - 1;
459 pl = normalize_boundary(pl);
460 if (significand_is_zero) {
461 mi.f = (v.f << 2) - 1;
462 mi.e = v.e - 2;
463 } else {
464 mi.f = (v.f << 1) - 1;
465 mi.e = v.e - 1;
466 }
467 mi.f <<= mi.e - pl.e;
468 mi.e = pl.e;
469 *out_m_plus = pl;
470 *out_m_minus = mi;
471}
472
473#define TEN2 100
474static void digit_gen(diy_fp_t Mp, diy_fp_t delta, char* buffer, int* len, int* K)
475{
476 uint32_t div, p1;
477 uint64_t p2;
478 int d,kappa;
479 diy_fp_t one;
480 one.f = ((uint64_t) 1) << -Mp.e; one.e = Mp.e;
481 p1 = Mp.f >> -one.e;
482 p2 = Mp.f & (one.f - 1);
483 *len = 0; kappa = 3; div = TEN2;
484 while (kappa > 0) {
485 d = p1 / div;
486 if (d || *len) buffer[(*len)++] = '0' + d;
487 p1 %= div; kappa--; div /= 10;
488 if ((((uint64_t)p1)<<-one.e)+p2 <= delta.f) {
489 *K += kappa; return;
490 }
491 }
492 do {
493 p2 *= 10;
494 d = p2 >> -one.e;
495 if (d || *len) buffer[(*len)++] = '0' + d;
496 p2 &= one.f - 1; kappa--; delta.f *= 10;
497 } while (p2 > delta.f);
498 *K += kappa;
499}
500
501int
502js_grisu2(double v, char *buffer, int *K)
503{
504 int length, mk;
505 diy_fp_t w_m, w_p, c_mk, Wp, Wm, delta;
506 int q = 64, alpha = -59, gamma = -56;
507 normalized_boundaries(v, &w_m, &w_p);
508 mk = k_comp(w_p.e + q, alpha, gamma);
509 c_mk = cached_power(mk);
510 Wp = multiply(w_p, c_mk);
511 Wm = multiply(w_m, c_mk);
512 Wm.f++; Wp.f--;
513 delta = minus(Wp, Wm);
514 *K = -mk;
515 digit_gen(Wp, delta, buffer, &length, K);
516 return length;
517}
518
519/*
520 * strtod.c
521 *
522 * Copyright (c) 1988-1993 The Regents of the University of California.
523 * Copyright (c) 1994 Sun Microsystems, Inc.
524 *
525 * Permission to use, copy, modify, and distribute this software and its
526 * documentation for any purpose and without fee is hereby granted, provided
527 * that the above copyright notice appear in all copies. The University of
528 * California makes no representations about the suitability of this software
529 * for any purpose. It is provided "as is" without express or implied warranty.
530 */
531
532/* Largest possible base 10 exponent. Any exponent larger than this will
533 * already produce underflow or overflow, so there's no need to worry about
534 * additional digits.
535 */
536static int maxExponent = 511;
537
538/* Table giving binary powers of 10. Entry
539 * is 10^2^i. Used to convert decimal
540 * exponents into floating-point numbers.
541 */
542static double powersOf10[] = {
543 10.,
544 100.,
545 1.0e4,
546 1.0e8,
547 1.0e16,
548 1.0e32,
549 1.0e64,
550 1.0e128,
551 1.0e256
552};
553
554/* Parse a decimal ASCII floating-point number, optionally preceded by white
555 * space. Must have form "-I.FE-X", where I is the integer part of the
556 * mantissa, F is the fractional part of the mantissa, and X is the exponent.
557 * Either of the signs may be "+", "-", or omitted. Either I or F may be
558 * omitted, or both. The decimal point isn't necessary unless F is present.
559 * The "E" may actually be an "e". E and X may both be omitted (but not just
560 * one).
561 */
562double
563js_strtod(const char *string, char **endPtr)
564{
565 int sign, expSign = FALSE;
566 double fraction, dblExp, *d;
567 register const char *p;
568 register int c;
569
570 /* Exponent read from "EX" field. */
571 int exp = 0;
572
573 /* Exponent that derives from the fractional part. Under normal
574 * circumstances, it is the negative of the number of digits in F.
575 * However, if I is very long, the last digits of I get dropped
576 * (otherwise a long I with a large negative exponent could cause an
577 * unnecessary overflow on I alone). In this case, fracExp is
578 * incremented one for each dropped digit.
579 */
580 int fracExp = 0;
581
582 /* Number of digits in mantissa. */
583 int mantSize;
584
585 /* Number of mantissa digits BEFORE decimal point. */
586 int decPt;
587
588 /* Temporarily holds location of exponent in string. */
589 const char *pExp;
590
591 /*
592 * Strip off leading blanks and check for a sign.
593 */
594
595 p = string;
596 while (*p == ' ' || *p == '\t' || *p == '\n' || *p == '\r') {
597 p += 1;
598 }
599 if (*p == '-') {
600 sign = TRUE;
601 p += 1;
602 } else {
603 if (*p == '+') {
604 p += 1;
605 }
606 sign = FALSE;
607 }
608
609 /*
610 * Count the number of digits in the mantissa (including the decimal
611 * point), and also locate the decimal point.
612 */
613
614 decPt = -1;
615 for (mantSize = 0; ; mantSize += 1)
616 {
617 c = *p;
618 if (!(c>='0'&&c<='9')) {
619 if ((c != '.') || (decPt >= 0)) {
620 break;
621 }
622 decPt = mantSize;
623 }
624 p += 1;
625 }
626
627 /*
628 * Now suck up the digits in the mantissa. Use two integers to
629 * collect 9 digits each (this is faster than using floating-point).
630 * If the mantissa has more than 18 digits, ignore the extras, since
631 * they can't affect the value anyway.
632 */
633
634 pExp = p;
635 p -= mantSize;
636 if (decPt < 0) {
637 decPt = mantSize;
638 } else {
639 mantSize -= 1; /* One of the digits was the point. */
640 }
641 if (mantSize > 18) {
642 fracExp = decPt - 18;
643 mantSize = 18;
644 } else {
645 fracExp = decPt - mantSize;
646 }
647 if (mantSize == 0) {
648 fraction = 0.0;
649 p = string;
650 goto done;
651 } else {
652 int frac1, frac2;
653 frac1 = 0;
654 for ( ; mantSize > 9; mantSize -= 1)
655 {
656 c = *p;
657 p += 1;
658 if (c == '.') {
659 c = *p;
660 p += 1;
661 }
662 frac1 = 10*frac1 + (c - '0');
663 }
664 frac2 = 0;
665 for (; mantSize > 0; mantSize -= 1)
666 {
667 c = *p;
668 p += 1;
669 if (c == '.') {
670 c = *p;
671 p += 1;
672 }
673 frac2 = 10*frac2 + (c - '0');
674 }
675 fraction = (1.0e9 * frac1) + frac2;
676 }
677
678 /*
679 * Skim off the exponent.
680 */
681
682 p = pExp;
683 if ((*p == 'E') || (*p == 'e')) {
684 p += 1;
685 if (*p == '-') {
686 expSign = TRUE;
687 p += 1;
688 } else {
689 if (*p == '+') {
690 p += 1;
691 }
692 expSign = FALSE;
693 }
694 while ((*p >= '0') && (*p <= '9')) {
695 exp = exp * 10 + (*p - '0');
696 p += 1;
697 }
698 }
699 if (expSign) {
700 exp = fracExp - exp;
701 } else {
702 exp = fracExp + exp;
703 }
704
705 /*
706 * Generate a floating-point number that represents the exponent.
707 * Do this by processing the exponent one bit at a time to combine
708 * many powers of 2 of 10. Then combine the exponent with the
709 * fraction.
710 */
711
712 if (exp < -maxExponent) {
713 exp = maxExponent;
714 expSign = TRUE;
715 errno = ERANGE;
716 } else if (exp > maxExponent) {
717 exp = maxExponent;
718 expSign = FALSE;
719 errno = ERANGE;
720 } else if (exp < 0) {
721 expSign = TRUE;
722 exp = -exp;
723 } else {
724 expSign = FALSE;
725 }
726 dblExp = 1.0;
727 for (d = powersOf10; exp != 0; exp >>= 1, d += 1) {
728 if (exp & 01) {
729 dblExp *= *d;
730 }
731 }
732 if (expSign) {
733 fraction /= dblExp;
734 } else {
735 fraction *= dblExp;
736 }
737
738done:
739 if (endPtr != NULL) {
740 *endPtr = (char *) p;
741 }
742
743 if (sign) {
744 return -fraction;
745 }
746 return fraction;
747}
748