Coverage Report

Created: 2026-06-03 06:22

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/ruby/ext/json/vendor/ryu.h
Line
Count
Source
1
// Copyright 2018 Ulf Adams
2
//
3
// The contents of this file may be used under the terms of the Apache License,
4
// Version 2.0.
5
//
6
// Alternatively, the contents of this file may be used under the terms of
7
// the Boost Software License, Version 1.0.
8
//
9
// Unless required by applicable law or agreed to in writing, this software
10
// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11
// KIND, either express or implied.
12
//
13
// ---
14
//
15
//                               Apache License
16
//                         Version 2.0, January 2004
17
//                      http://www.apache.org/licenses/
18
//
19
// TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
20
//
21
// 1. Definitions.
22
//
23
//    "License" shall mean the terms and conditions for use, reproduction,
24
//    and distribution as defined by Sections 1 through 9 of this document.
25
//
26
//    "Licensor" shall mean the copyright owner or entity authorized by
27
//    the copyright owner that is granting the License.
28
//
29
//    "Legal Entity" shall mean the union of the acting entity and all
30
//    other entities that control, are controlled by, or are under common
31
//    control with that entity. For the purposes of this definition,
32
//    "control" means (i) the power, direct or indirect, to cause the
33
//    direction or management of such entity, whether by contract or
34
//    otherwise, or (ii) ownership of fifty percent (50%) or more of the
35
//    outstanding shares, or (iii) beneficial ownership of such entity.
36
//
37
//    "You" (or "Your") shall mean an individual or Legal Entity
38
//    exercising permissions granted by this License.
39
//
40
//    "Source" form shall mean the preferred form for making modifications,
41
//    including but not limited to software source code, documentation
42
//    source, and configuration files.
43
//
44
//    "Object" form shall mean any form resulting from mechanical
45
//    transformation or translation of a Source form, including but
46
//    not limited to compiled object code, generated documentation,
47
//    and conversions to other media types.
48
//
49
//    "Work" shall mean the work of authorship, whether in Source or
50
//    Object form, made available under the License, as indicated by a
51
//    copyright notice that is included in or attached to the work
52
//    (an example is provided in the Appendix below).
53
//
54
//    "Derivative Works" shall mean any work, whether in Source or Object
55
//    form, that is based on (or derived from) the Work and for which the
56
//    editorial revisions, annotations, elaborations, or other modifications
57
//    represent, as a whole, an original work of authorship. For the purposes
58
//    of this License, Derivative Works shall not include works that remain
59
//    separable from, or merely link (or bind by name) to the interfaces of,
60
//    the Work and Derivative Works thereof.
61
//
62
//    "Contribution" shall mean any work of authorship, including
63
//    the original version of the Work and any modifications or additions
64
//    to that Work or Derivative Works thereof, that is intentionally
65
//    submitted to Licensor for inclusion in the Work by the copyright owner
66
//    or by an individual or Legal Entity authorized to submit on behalf of
67
//    the copyright owner. For the purposes of this definition, "submitted"
68
//    means any form of electronic, verbal, or written communication sent
69
//    to the Licensor or its representatives, including but not limited to
70
//    communication on electronic mailing lists, source code control systems,
71
//    and issue tracking systems that are managed by, or on behalf of, the
72
//    Licensor for the purpose of discussing and improving the Work, but
73
//    excluding communication that is conspicuously marked or otherwise
74
//    designated in writing by the copyright owner as "Not a Contribution."
75
//
76
//    "Contributor" shall mean Licensor and any individual or Legal Entity
77
//    on behalf of whom a Contribution has been received by Licensor and
78
//    subsequently incorporated within the Work.
79
//
80
// 2. Grant of Copyright License. Subject to the terms and conditions of
81
//    this License, each Contributor hereby grants to You a perpetual,
82
//    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
83
//    copyright license to reproduce, prepare Derivative Works of,
84
//    publicly display, publicly perform, sublicense, and distribute the
85
//    Work and such Derivative Works in Source or Object form.
86
//
87
// 3. Grant of Patent License. Subject to the terms and conditions of
88
//    this License, each Contributor hereby grants to You a perpetual,
89
//    worldwide, non-exclusive, no-charge, royalty-free, irrevocable
90
//    (except as stated in this section) patent license to make, have made,
91
//    use, offer to sell, sell, import, and otherwise transfer the Work,
92
//    where such license applies only to those patent claims licensable
93
//    by such Contributor that are necessarily infringed by their
94
//    Contribution(s) alone or by combination of their Contribution(s)
95
//    with the Work to which such Contribution(s) was submitted. If You
96
//    institute patent litigation against any entity (including a
97
//    cross-claim or counterclaim in a lawsuit) alleging that the Work
98
//    or a Contribution incorporated within the Work constitutes direct
99
//    or contributory patent infringement, then any patent licenses
100
//    granted to You under this License for that Work shall terminate
101
//    as of the date such litigation is filed.
102
//
103
// 4. Redistribution. You may reproduce and distribute copies of the
104
//    Work or Derivative Works thereof in any medium, with or without
105
//    modifications, and in Source or Object form, provided that You
106
//    meet the following conditions:
107
//
108
//    (a) You must give any other recipients of the Work or
109
//        Derivative Works a copy of this License; and
110
//
111
//    (b) You must cause any modified files to carry prominent notices
112
//        stating that You changed the files; and
113
//
114
//    (c) You must retain, in the Source form of any Derivative Works
115
//        that You distribute, all copyright, patent, trademark, and
116
//        attribution notices from the Source form of the Work,
117
//        excluding those notices that do not pertain to any part of
118
//        the Derivative Works; and
119
//
120
//    (d) If the Work includes a "NOTICE" text file as part of its
121
//        distribution, then any Derivative Works that You distribute must
122
//        include a readable copy of the attribution notices contained
123
//        within such NOTICE file, excluding those notices that do not
124
//        pertain to any part of the Derivative Works, in at least one
125
//        of the following places: within a NOTICE text file distributed
126
//        as part of the Derivative Works; within the Source form or
127
//        documentation, if provided along with the Derivative Works; or,
128
//        within a display generated by the Derivative Works, if and
129
//        wherever such third-party notices normally appear. The contents
130
//        of the NOTICE file are for informational purposes only and
131
//        do not modify the License. You may add Your own attribution
132
//        notices within Derivative Works that You distribute, alongside
133
//        or as an addendum to the NOTICE text from the Work, provided
134
//        that such additional attribution notices cannot be construed
135
//        as modifying the License.
136
//
137
//    You may add Your own copyright statement to Your modifications and
138
//    may provide additional or different license terms and conditions
139
//    for use, reproduction, or distribution of Your modifications, or
140
//    for any such Derivative Works as a whole, provided Your use,
141
//    reproduction, and distribution of the Work otherwise complies with
142
//    the conditions stated in this License.
143
//
144
// 5. Submission of Contributions. Unless You explicitly state otherwise,
145
//    any Contribution intentionally submitted for inclusion in the Work
146
//    by You to the Licensor shall be under the terms and conditions of
147
//    this License, without any additional terms or conditions.
148
//    Notwithstanding the above, nothing herein shall supersede or modify
149
//    the terms of any separate license agreement you may have executed
150
//    with Licensor regarding such Contributions.
151
//
152
// 6. Trademarks. This License does not grant permission to use the trade
153
//    names, trademarks, service marks, or product names of the Licensor,
154
//    except as required for reasonable and customary use in describing the
155
//    origin of the Work and reproducing the content of the NOTICE file.
156
//
157
// 7. Disclaimer of Warranty. Unless required by applicable law or
158
//    agreed to in writing, Licensor provides the Work (and each
159
//    Contributor provides its Contributions) on an "AS IS" BASIS,
160
//    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
161
//    implied, including, without limitation, any warranties or conditions
162
//    of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
163
//    PARTICULAR PURPOSE. You are solely responsible for determining the
164
//    appropriateness of using or redistributing the Work and assume any
165
//    risks associated with Your exercise of permissions under this License.
166
//
167
// 8. Limitation of Liability. In no event and under no legal theory,
168
//    whether in tort (including negligence), contract, or otherwise,
169
//    unless required by applicable law (such as deliberate and grossly
170
//    negligent acts) or agreed to in writing, shall any Contributor be
171
//    liable to You for damages, including any direct, indirect, special,
172
//    incidental, or consequential damages of any character arising as a
173
//    result of this License or out of the use or inability to use the
174
//    Work (including but not limited to damages for loss of goodwill,
175
//    work stoppage, computer failure or malfunction, or any and all
176
//    other commercial damages or losses), even if such Contributor
177
//    has been advised of the possibility of such damages.
178
//
179
// 9. Accepting Warranty or Additional Liability. While redistributing
180
//    the Work or Derivative Works thereof, You may choose to offer,
181
//    and charge a fee for, acceptance of support, warranty, indemnity,
182
//    or other liability obligations and/or rights consistent with this
183
//    License. However, in accepting such obligations, You may act only
184
//    on Your own behalf and on Your sole responsibility, not on behalf
185
//    of any other Contributor, and only if You agree to indemnify,
186
//    defend, and hold each Contributor harmless for any liability
187
//    incurred by, or claims asserted against, such Contributor by reason
188
//    of your accepting any such warranty or additional liability.
189
//
190
// END OF TERMS AND CONDITIONS
191
//
192
// APPENDIX: How to apply the Apache License to your work.
193
//
194
//    To apply the Apache License to your work, attach the following
195
//    boilerplate notice, with the fields enclosed by brackets "[]"
196
//    replaced with your own identifying information. (Don't include
197
//    the brackets!)  The text should be enclosed in the appropriate
198
//    comment syntax for the file format. We also recommend that a
199
//    file or class name and description of purpose be included on the
200
//    same "printed page" as the copyright notice for easier
201
//    identification within third-party archives.
202
//
203
// Copyright [yyyy] [name of copyright owner]
204
//
205
// Licensed under the Apache License, Version 2.0 (the "License");
206
// you may not use this file except in compliance with the License.
207
// You may obtain a copy of the License at
208
//
209
//     http://www.apache.org/licenses/LICENSE-2.0
210
//
211
// Unless required by applicable law or agreed to in writing, software
212
// distributed under the License is distributed on an "AS IS" BASIS,
213
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
214
// See the License for the specific language governing permissions and
215
// limitations under the License.
216
//
217
// ---
218
//
219
// Boost Software License - Version 1.0 - August 17th, 2003
220
//
221
// Permission is hereby granted, free of charge, to any person or organization
222
// obtaining a copy of the software and accompanying documentation covered by
223
// this license (the "Software") to use, reproduce, display, distribute,
224
// execute, and transmit the Software, and to prepare derivative works of the
225
// Software, and to permit third-parties to whom the Software is furnished to
226
// do so, all subject to the following:
227
//
228
// The copyright notices in the Software and this entire statement, including
229
// the above license grant, this restriction and the following disclaimer,
230
// must be included in all copies of the Software, in whole or in part, and
231
// all derivative works of the Software, unless such copies or derivative
232
// works are solely in the form of machine-executable object code generated by
233
// a source language processor.
234
//
235
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
236
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
237
// FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
238
// SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
239
// FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
240
// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
241
// DEALINGS IN THE SOFTWARE.
242
//
243
// ---
244
// Minimal Ryu implementation adapted for Ruby JSON gem by Josef Šimánek
245
// Optimized for pre-extracted mantissa/exponent from JSON parsing
246
// This is a stripped-down version containing only what's needed for
247
// converting decimal mantissa+exponent to IEEE 754 double precision.
248
249
#ifndef RYU_H
250
#define RYU_H
251
252
#include <stdint.h>
253
#include <stdbool.h>
254
#include <string.h>
255
256
// Detect __builtin_clzll availability (for floor_log2)
257
// Note: MSVC doesn't have __builtin_clzll, so we provide a fallback
258
#ifdef __clang__
259
  #if __has_builtin(__builtin_clzll)
260
    #define RYU_HAVE_BUILTIN_CLZLL 1
261
  #else
262
    #define RYU_HAVE_BUILTIN_CLZLL 0
263
  #endif
264
#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
265
  #define RYU_HAVE_BUILTIN_CLZLL 1
266
#else
267
  #define RYU_HAVE_BUILTIN_CLZLL 0
268
#endif
269
270
// Count leading zeros (for floor_log2)
271
static inline uint32_t ryu_leading_zeros64(uint64_t input)
272
186k
{
273
186k
#if RYU_HAVE_BUILTIN_CLZLL
274
186k
  return __builtin_clzll(input);
275
#else
276
  // Fallback: binary search for the highest set bit
277
  // This works on MSVC and other compilers without __builtin_clzll
278
  if (input == 0) return 64;
279
  uint32_t n = 0;
280
  if (input <= 0x00000000FFFFFFFFULL) { n += 32; input <<= 32; }
281
  if (input <= 0x0000FFFFFFFFFFFFULL) { n += 16; input <<= 16; }
282
  if (input <= 0x00FFFFFFFFFFFFFFULL) { n +=  8; input <<=  8; }
283
  if (input <= 0x0FFFFFFFFFFFFFFFULL) { n +=  4; input <<=  4; }
284
  if (input <= 0x3FFFFFFFFFFFFFFFULL) { n +=  2; input <<=  2; }
285
  if (input <= 0x7FFFFFFFFFFFFFFFULL) { n +=  1; }
286
  return n;
287
#endif
288
186k
}
289
290
// These tables are generated by PrintDoubleLookupTable.
291
12.2k
#define DOUBLE_POW5_INV_BITCOUNT 125
292
80.9k
#define DOUBLE_POW5_BITCOUNT 125
293
294
#define DOUBLE_POW5_INV_TABLE_SIZE 342
295
#define DOUBLE_POW5_TABLE_SIZE 326
296
297
static const uint64_t DOUBLE_POW5_INV_SPLIT[DOUBLE_POW5_INV_TABLE_SIZE][2] = {
298
  {                    1u, 2305843009213693952u }, { 11068046444225730970u, 1844674407370955161u },
299
  {  5165088340638674453u, 1475739525896764129u }, {  7821419487252849886u, 1180591620717411303u },
300
  {  8824922364862649494u, 1888946593147858085u }, {  7059937891890119595u, 1511157274518286468u },
301
  { 13026647942995916322u, 1208925819614629174u }, {  9774590264567735146u, 1934281311383406679u },
302
  { 11509021026396098440u, 1547425049106725343u }, { 16585914450600699399u, 1237940039285380274u },
303
  { 15469416676735388068u, 1980704062856608439u }, { 16064882156130220778u, 1584563250285286751u },
304
  {  9162556910162266299u, 1267650600228229401u }, {  7281393426775805432u, 2028240960365167042u },
305
  { 16893161185646375315u, 1622592768292133633u }, {  2446482504291369283u, 1298074214633706907u },
306
  {  7603720821608101175u, 2076918743413931051u }, {  2393627842544570617u, 1661534994731144841u },
307
  { 16672297533003297786u, 1329227995784915872u }, { 11918280793837635165u, 2126764793255865396u },
308
  {  5845275820328197809u, 1701411834604692317u }, { 15744267100488289217u, 1361129467683753853u },
309
  {  3054734472329800808u, 2177807148294006166u }, { 17201182836831481939u, 1742245718635204932u },
310
  {  6382248639981364905u, 1393796574908163946u }, {  2832900194486363201u, 2230074519853062314u },
311
  {  5955668970331000884u, 1784059615882449851u }, {  1075186361522890384u, 1427247692705959881u },
312
  { 12788344622662355584u, 2283596308329535809u }, { 13920024512871794791u, 1826877046663628647u },
313
  {  3757321980813615186u, 1461501637330902918u }, { 10384555214134712795u, 1169201309864722334u },
314
  {  5547241898389809503u, 1870722095783555735u }, {  4437793518711847602u, 1496577676626844588u },
315
  { 10928932444453298728u, 1197262141301475670u }, { 17486291911125277965u, 1915619426082361072u },
316
  {  6610335899416401726u, 1532495540865888858u }, { 12666966349016942027u, 1225996432692711086u },
317
  { 12888448528943286597u, 1961594292308337738u }, { 17689456452638449924u, 1569275433846670190u },
318
  { 14151565162110759939u, 1255420347077336152u }, {  7885109000409574610u, 2008672555323737844u },
319
  {  9997436015069570011u, 1606938044258990275u }, {  7997948812055656009u, 1285550435407192220u },
320
  { 12796718099289049614u, 2056880696651507552u }, {  2858676849947419045u, 1645504557321206042u },
321
  { 13354987924183666206u, 1316403645856964833u }, { 17678631863951955605u, 2106245833371143733u },
322
  {  3074859046935833515u, 1684996666696914987u }, { 13527933681774397782u, 1347997333357531989u },
323
  { 10576647446613305481u, 2156795733372051183u }, { 15840015586774465031u, 1725436586697640946u },
324
  {  8982663654677661702u, 1380349269358112757u }, { 18061610662226169046u, 2208558830972980411u },
325
  { 10759939715039024913u, 1766847064778384329u }, { 12297300586773130254u, 1413477651822707463u },
326
  { 15986332124095098083u, 2261564242916331941u }, {  9099716884534168143u, 1809251394333065553u },
327
  { 14658471137111155161u, 1447401115466452442u }, {  4348079280205103483u, 1157920892373161954u },
328
  { 14335624477811986218u, 1852673427797059126u }, {  7779150767507678651u, 1482138742237647301u },
329
  {  2533971799264232598u, 1185710993790117841u }, { 15122401323048503126u, 1897137590064188545u },
330
  { 12097921058438802501u, 1517710072051350836u }, {  5988988032009131678u, 1214168057641080669u },
331
  { 16961078480698431330u, 1942668892225729070u }, { 13568862784558745064u, 1554135113780583256u },
332
  {  7165741412905085728u, 1243308091024466605u }, { 11465186260648137165u, 1989292945639146568u },
333
  { 16550846638002330379u, 1591434356511317254u }, { 16930026125143774626u, 1273147485209053803u },
334
  {  4951948911778577463u, 2037035976334486086u }, {   272210314680951647u, 1629628781067588869u },
335
  {  3907117066486671641u, 1303703024854071095u }, {  6251387306378674625u, 2085924839766513752u },
336
  { 16069156289328670670u, 1668739871813211001u }, {  9165976216721026213u, 1334991897450568801u },
337
  {  7286864317269821294u, 2135987035920910082u }, { 16897537898041588005u, 1708789628736728065u },
338
  { 13518030318433270404u, 1367031702989382452u }, {  6871453250525591353u, 2187250724783011924u },
339
  {  9186511415162383406u, 1749800579826409539u }, { 11038557946871817048u, 1399840463861127631u },
340
  { 10282995085511086630u, 2239744742177804210u }, {  8226396068408869304u, 1791795793742243368u },
341
  { 13959814484210916090u, 1433436634993794694u }, { 11267656730511734774u, 2293498615990071511u },
342
  {  5324776569667477496u, 1834798892792057209u }, {  7949170070475892320u, 1467839114233645767u },
343
  { 17427382500606444826u, 1174271291386916613u }, {  5747719112518849781u, 1878834066219066582u },
344
  { 15666221734240810795u, 1503067252975253265u }, { 12532977387392648636u, 1202453802380202612u },
345
  {  5295368560860596524u, 1923926083808324180u }, {  4236294848688477220u, 1539140867046659344u },
346
  {  7078384693692692099u, 1231312693637327475u }, { 11325415509908307358u, 1970100309819723960u },
347
  {  9060332407926645887u, 1576080247855779168u }, { 14626963555825137356u, 1260864198284623334u },
348
  { 12335095245094488799u, 2017382717255397335u }, {  9868076196075591040u, 1613906173804317868u },
349
  { 15273158586344293478u, 1291124939043454294u }, { 13369007293925138595u, 2065799902469526871u },
350
  {  7005857020398200553u, 1652639921975621497u }, { 16672732060544291412u, 1322111937580497197u },
351
  { 11918976037903224966u, 2115379100128795516u }, {  5845832015580669650u, 1692303280103036413u },
352
  { 12055363241948356366u, 1353842624082429130u }, {   841837113407818570u, 2166148198531886609u },
353
  {  4362818505468165179u, 1732918558825509287u }, { 14558301248600263113u, 1386334847060407429u },
354
  { 12225235553534690011u, 2218135755296651887u }, {  2401490813343931363u, 1774508604237321510u },
355
  {  1921192650675145090u, 1419606883389857208u }, { 17831303500047873437u, 2271371013423771532u },
356
  {  6886345170554478103u, 1817096810739017226u }, {  1819727321701672159u, 1453677448591213781u },
357
  { 16213177116328979020u, 1162941958872971024u }, { 14873036941900635463u, 1860707134196753639u },
358
  { 15587778368262418694u, 1488565707357402911u }, {  8780873879868024632u, 1190852565885922329u },
359
  {  2981351763563108441u, 1905364105417475727u }, { 13453127855076217722u, 1524291284333980581u },
360
  {  7073153469319063855u, 1219433027467184465u }, { 11317045550910502167u, 1951092843947495144u },
361
  { 12742985255470312057u, 1560874275157996115u }, { 10194388204376249646u, 1248699420126396892u },
362
  {  1553625868034358140u, 1997919072202235028u }, {  8621598323911307159u, 1598335257761788022u },
363
  { 17965325103354776697u, 1278668206209430417u }, { 13987124906400001422u, 2045869129935088668u },
364
  {   121653480894270168u, 1636695303948070935u }, {    97322784715416134u, 1309356243158456748u },
365
  { 14913111714512307107u, 2094969989053530796u }, {  8241140556867935363u, 1675975991242824637u },
366
  { 17660958889720079260u, 1340780792994259709u }, { 17189487779326395846u, 2145249268790815535u },
367
  { 13751590223461116677u, 1716199415032652428u }, { 18379969808252713988u, 1372959532026121942u },
368
  { 14650556434236701088u, 2196735251241795108u }, {   652398703163629901u, 1757388200993436087u },
369
  { 11589965406756634890u, 1405910560794748869u }, {  7475898206584884855u, 2249456897271598191u },
370
  {  2291369750525997561u, 1799565517817278553u }, {  9211793429904618695u, 1439652414253822842u },
371
  { 18428218302589300235u, 2303443862806116547u }, {  7363877012587619542u, 1842755090244893238u },
372
  { 13269799239553916280u, 1474204072195914590u }, { 10615839391643133024u, 1179363257756731672u },
373
  {  2227947767661371545u, 1886981212410770676u }, { 16539753473096738529u, 1509584969928616540u },
374
  { 13231802778477390823u, 1207667975942893232u }, {  6413489186596184024u, 1932268761508629172u },
375
  { 16198837793502678189u, 1545815009206903337u }, {  5580372605318321905u, 1236652007365522670u },
376
  {  8928596168509315048u, 1978643211784836272u }, { 18210923379033183008u, 1582914569427869017u },
377
  {  7190041073742725760u, 1266331655542295214u }, {   436019273762630246u, 2026130648867672343u },
378
  {  7727513048493924843u, 1620904519094137874u }, {  9871359253537050198u, 1296723615275310299u },
379
  {  4726128361433549347u, 2074757784440496479u }, {  7470251503888749801u, 1659806227552397183u },
380
  { 13354898832594820487u, 1327844982041917746u }, { 13989140502667892133u, 2124551971267068394u },
381
  { 14880661216876224029u, 1699641577013654715u }, { 11904528973500979224u, 1359713261610923772u },
382
  {  4289851098633925465u, 2175541218577478036u }, { 18189276137874781665u, 1740432974861982428u },
383
  {  3483374466074094362u, 1392346379889585943u }, {  1884050330976640656u, 2227754207823337509u },
384
  {  5196589079523222848u, 1782203366258670007u }, { 15225317707844309248u, 1425762693006936005u },
385
  {  5913764258841343181u, 2281220308811097609u }, {  8420360221814984868u, 1824976247048878087u },
386
  { 17804334621677718864u, 1459980997639102469u }, { 17932816512084085415u, 1167984798111281975u },
387
  { 10245762345624985047u, 1868775676978051161u }, {  4507261061758077715u, 1495020541582440929u },
388
  {  7295157664148372495u, 1196016433265952743u }, {  7982903447895485668u, 1913626293225524389u },
389
  { 10075671573058298858u, 1530901034580419511u }, {  4371188443704728763u, 1224720827664335609u },
390
  { 14372599139411386667u, 1959553324262936974u }, { 15187428126271019657u, 1567642659410349579u },
391
  { 15839291315758726049u, 1254114127528279663u }, {  3206773216762499739u, 2006582604045247462u },
392
  { 13633465017635730761u, 1605266083236197969u }, { 14596120828850494932u, 1284212866588958375u },
393
  {  4907049252451240275u, 2054740586542333401u }, {   236290587219081897u, 1643792469233866721u },
394
  { 14946427728742906810u, 1315033975387093376u }, { 16535586736504830250u, 2104054360619349402u },
395
  {  5849771759720043554u, 1683243488495479522u }, { 15747863852001765813u, 1346594790796383617u },
396
  { 10439186904235184007u, 2154551665274213788u }, { 15730047152871967852u, 1723641332219371030u },
397
  { 12584037722297574282u, 1378913065775496824u }, {  9066413911450387881u, 2206260905240794919u },
398
  { 10942479943902220628u, 1765008724192635935u }, {  8753983955121776503u, 1412006979354108748u },
399
  { 10317025513452932081u, 2259211166966573997u }, {   874922781278525018u, 1807368933573259198u },
400
  {  8078635854506640661u, 1445895146858607358u }, { 13841606313089133175u, 1156716117486885886u },
401
  { 14767872471458792434u, 1850745787979017418u }, {   746251532941302978u, 1480596630383213935u },
402
  {   597001226353042382u, 1184477304306571148u }, { 15712597221132509104u, 1895163686890513836u },
403
  {  8880728962164096960u, 1516130949512411069u }, { 10793931984473187891u, 1212904759609928855u },
404
  { 17270291175157100626u, 1940647615375886168u }, {  2748186495899949531u, 1552518092300708935u },
405
  {  2198549196719959625u, 1242014473840567148u }, { 18275073973719576693u, 1987223158144907436u },
406
  { 10930710364233751031u, 1589778526515925949u }, { 12433917106128911148u, 1271822821212740759u },
407
  {  8826220925580526867u, 2034916513940385215u }, {  7060976740464421494u, 1627933211152308172u },
408
  { 16716827836597268165u, 1302346568921846537u }, { 11989529279587987770u, 2083754510274954460u },
409
  {  9591623423670390216u, 1667003608219963568u }, { 15051996368420132820u, 1333602886575970854u },
410
  { 13015147745246481542u, 2133764618521553367u }, {  3033420566713364587u, 1707011694817242694u },
411
  {  6116085268112601993u, 1365609355853794155u }, {  9785736428980163188u, 2184974969366070648u },
412
  { 15207286772667951197u, 1747979975492856518u }, {  1097782973908629988u, 1398383980394285215u },
413
  {  1756452758253807981u, 2237414368630856344u }, {  5094511021344956708u, 1789931494904685075u },
414
  {  4075608817075965366u, 1431945195923748060u }, {  6520974107321544586u, 2291112313477996896u },
415
  {  1527430471115325346u, 1832889850782397517u }, { 12289990821117991246u, 1466311880625918013u },
416
  { 17210690286378213644u, 1173049504500734410u }, {  9090360384495590213u, 1876879207201175057u },
417
  { 18340334751822203140u, 1501503365760940045u }, { 14672267801457762512u, 1201202692608752036u },
418
  { 16096930852848599373u, 1921924308174003258u }, {  1809498238053148529u, 1537539446539202607u },
419
  { 12515645034668249793u, 1230031557231362085u }, {  1578287981759648052u, 1968050491570179337u },
420
  { 12330676829633449412u, 1574440393256143469u }, { 13553890278448669853u, 1259552314604914775u },
421
  {  3239480371808320148u, 2015283703367863641u }, { 17348979556414297411u, 1612226962694290912u },
422
  {  6500486015647617283u, 1289781570155432730u }, { 10400777625036187652u, 2063650512248692368u },
423
  { 15699319729512770768u, 1650920409798953894u }, { 16248804598352126938u, 1320736327839163115u },
424
  {  7551343283653851484u, 2113178124542660985u }, {  6041074626923081187u, 1690542499634128788u },
425
  { 12211557331022285596u, 1352433999707303030u }, {  1091747655926105338u, 2163894399531684849u },
426
  {  4562746939482794594u, 1731115519625347879u }, {  7339546366328145998u, 1384892415700278303u },
427
  {  8053925371383123274u, 2215827865120445285u }, {  6443140297106498619u, 1772662292096356228u },
428
  { 12533209867169019542u, 1418129833677084982u }, {  5295740528502789974u, 2269007733883335972u },
429
  { 15304638867027962949u, 1815206187106668777u }, {  4865013464138549713u, 1452164949685335022u },
430
  { 14960057215536570740u, 1161731959748268017u }, {  9178696285890871890u, 1858771135597228828u },
431
  { 14721654658196518159u, 1487016908477783062u }, {  4398626097073393881u, 1189613526782226450u },
432
  {  7037801755317430209u, 1903381642851562320u }, {  5630241404253944167u, 1522705314281249856u },
433
  {   814844308661245011u, 1218164251424999885u }, {  1303750893857992017u, 1949062802279999816u },
434
  { 15800395974054034906u, 1559250241823999852u }, {  5261619149759407279u, 1247400193459199882u },
435
  { 12107939454356961969u, 1995840309534719811u }, {  5997002748743659252u, 1596672247627775849u },
436
  {  8486951013736837725u, 1277337798102220679u }, {  2511075177753209390u, 2043740476963553087u },
437
  { 13076906586428298482u, 1634992381570842469u }, { 14150874083884549109u, 1307993905256673975u },
438
  {  4194654460505726958u, 2092790248410678361u }, { 18113118827372222859u, 1674232198728542688u },
439
  {  3422448617672047318u, 1339385758982834151u }, { 16543964232501006678u, 2143017214372534641u },
440
  {  9545822571258895019u, 1714413771498027713u }, { 15015355686490936662u, 1371531017198422170u },
441
  {  5577825024675947042u, 2194449627517475473u }, { 11840957649224578280u, 1755559702013980378u },
442
  { 16851463748863483271u, 1404447761611184302u }, { 12204946739213931940u, 2247116418577894884u },
443
  { 13453306206113055875u, 1797693134862315907u }, {  3383947335406624054u, 1438154507889852726u },
444
  { 16482362180876329456u, 2301047212623764361u }, {  9496540929959153242u, 1840837770099011489u },
445
  { 11286581558709232917u, 1472670216079209191u }, {  5339916432225476010u, 1178136172863367353u },
446
  {  4854517476818851293u, 1885017876581387765u }, {  3883613981455081034u, 1508014301265110212u },
447
  { 14174937629389795797u, 1206411441012088169u }, { 11611853762797942306u, 1930258305619341071u },
448
  {  5600134195496443521u, 1544206644495472857u }, { 15548153800622885787u, 1235365315596378285u },
449
  {  6430302007287065643u, 1976584504954205257u }, { 16212288050055383484u, 1581267603963364205u },
450
  { 12969830440044306787u, 1265014083170691364u }, {  9683682259845159889u, 2024022533073106183u },
451
  { 15125643437359948558u, 1619218026458484946u }, {  8411165935146048523u, 1295374421166787957u },
452
  { 17147214310975587960u, 2072599073866860731u }, { 10028422634038560045u, 1658079259093488585u },
453
  {  8022738107230848036u, 1326463407274790868u }, {  9147032156827446534u, 2122341451639665389u },
454
  { 11006974540203867551u, 1697873161311732311u }, {  5116230817421183718u, 1358298529049385849u },
455
  { 15564666937357714594u, 2173277646479017358u }, {  1383687105660440706u, 1738622117183213887u },
456
  { 12174996128754083534u, 1390897693746571109u }, {  8411947361780802685u, 2225436309994513775u },
457
  {  6729557889424642148u, 1780349047995611020u }, {  5383646311539713719u, 1424279238396488816u },
458
  {  1235136468979721303u, 2278846781434382106u }, { 15745504434151418335u, 1823077425147505684u },
459
  { 16285752362063044992u, 1458461940118004547u }, {  5649904260166615347u, 1166769552094403638u },
460
  {  5350498001524674232u, 1866831283351045821u }, {   591049586477829062u, 1493465026680836657u },
461
  { 11540886113407994219u, 1194772021344669325u }, {    18673707743239135u, 1911635234151470921u },
462
  { 14772334225162232601u, 1529308187321176736u }, {  8128518565387875758u, 1223446549856941389u },
463
  {  1937583260394870242u, 1957514479771106223u }, {  8928764237799716840u, 1566011583816884978u },
464
  { 14521709019723594119u, 1252809267053507982u }, {  8477339172590109297u, 2004494827285612772u },
465
  { 17849917782297818407u, 1603595861828490217u }, {  6901236596354434079u, 1282876689462792174u },
466
  { 18420676183650915173u, 2052602703140467478u }, {  3668494502695001169u, 1642082162512373983u },
467
  { 10313493231639821582u, 1313665730009899186u }, {  9122891541139893884u, 2101865168015838698u },
468
  { 14677010862395735754u, 1681492134412670958u }, {   673562245690857633u, 1345193707530136767u }
469
};
470
471
static const uint64_t DOUBLE_POW5_SPLIT[DOUBLE_POW5_TABLE_SIZE][2] = {
472
  {                    0u, 1152921504606846976u }, {                    0u, 1441151880758558720u },
473
  {                    0u, 1801439850948198400u }, {                    0u, 2251799813685248000u },
474
  {                    0u, 1407374883553280000u }, {                    0u, 1759218604441600000u },
475
  {                    0u, 2199023255552000000u }, {                    0u, 1374389534720000000u },
476
  {                    0u, 1717986918400000000u }, {                    0u, 2147483648000000000u },
477
  {                    0u, 1342177280000000000u }, {                    0u, 1677721600000000000u },
478
  {                    0u, 2097152000000000000u }, {                    0u, 1310720000000000000u },
479
  {                    0u, 1638400000000000000u }, {                    0u, 2048000000000000000u },
480
  {                    0u, 1280000000000000000u }, {                    0u, 1600000000000000000u },
481
  {                    0u, 2000000000000000000u }, {                    0u, 1250000000000000000u },
482
  {                    0u, 1562500000000000000u }, {                    0u, 1953125000000000000u },
483
  {                    0u, 1220703125000000000u }, {                    0u, 1525878906250000000u },
484
  {                    0u, 1907348632812500000u }, {                    0u, 1192092895507812500u },
485
  {                    0u, 1490116119384765625u }, {  4611686018427387904u, 1862645149230957031u },
486
  {  9799832789158199296u, 1164153218269348144u }, { 12249790986447749120u, 1455191522836685180u },
487
  { 15312238733059686400u, 1818989403545856475u }, { 14528612397897220096u, 2273736754432320594u },
488
  { 13692068767113150464u, 1421085471520200371u }, { 12503399940464050176u, 1776356839400250464u },
489
  { 15629249925580062720u, 2220446049250313080u }, {  9768281203487539200u, 1387778780781445675u },
490
  {  7598665485932036096u, 1734723475976807094u }, {   274959820560269312u, 2168404344971008868u },
491
  {  9395221924704944128u, 1355252715606880542u }, {  2520655369026404352u, 1694065894508600678u },
492
  { 12374191248137781248u, 2117582368135750847u }, { 14651398557727195136u, 1323488980084844279u },
493
  { 13702562178731606016u, 1654361225106055349u }, {  3293144668132343808u, 2067951531382569187u },
494
  { 18199116482078572544u, 1292469707114105741u }, {  8913837547316051968u, 1615587133892632177u },
495
  { 15753982952572452864u, 2019483917365790221u }, { 12152082354571476992u, 1262177448353618888u },
496
  { 15190102943214346240u, 1577721810442023610u }, {  9764256642163156992u, 1972152263052529513u },
497
  { 17631875447420442880u, 1232595164407830945u }, {  8204786253993389888u, 1540743955509788682u },
498
  {  1032610780636961552u, 1925929944387235853u }, {  2951224747111794922u, 1203706215242022408u },
499
  {  3689030933889743652u, 1504632769052528010u }, { 13834660704216955373u, 1880790961315660012u },
500
  { 17870034976990372916u, 1175494350822287507u }, { 17725857702810578241u, 1469367938527859384u },
501
  {  3710578054803671186u, 1836709923159824231u }, {    26536550077201078u, 2295887403949780289u },
502
  { 11545800389866720434u, 1434929627468612680u }, { 14432250487333400542u, 1793662034335765850u },
503
  {  8816941072311974870u, 2242077542919707313u }, { 17039803216263454053u, 1401298464324817070u },
504
  { 12076381983474541759u, 1751623080406021338u }, {  5872105442488401391u, 2189528850507526673u },
505
  { 15199280947623720629u, 1368455531567204170u }, {  9775729147674874978u, 1710569414459005213u },
506
  { 16831347453020981627u, 2138211768073756516u }, {  1296220121283337709u, 1336382355046097823u },
507
  { 15455333206886335848u, 1670477943807622278u }, { 10095794471753144002u, 2088097429759527848u },
508
  {  6309871544845715001u, 1305060893599704905u }, { 12499025449484531656u, 1631326116999631131u },
509
  { 11012095793428276666u, 2039157646249538914u }, { 11494245889320060820u, 1274473528905961821u },
510
  {   532749306367912313u, 1593091911132452277u }, {  5277622651387278295u, 1991364888915565346u },
511
  {  7910200175544436838u, 1244603055572228341u }, { 14499436237857933952u, 1555753819465285426u },
512
  {  8900923260467641632u, 1944692274331606783u }, { 12480606065433357876u, 1215432671457254239u },
513
  { 10989071563364309441u, 1519290839321567799u }, {  9124653435777998898u, 1899113549151959749u },
514
  {  8008751406574943263u, 1186945968219974843u }, {  5399253239791291175u, 1483682460274968554u },
515
  { 15972438586593889776u, 1854603075343710692u }, {   759402079766405302u, 1159126922089819183u },
516
  { 14784310654990170340u, 1448908652612273978u }, {  9257016281882937117u, 1811135815765342473u },
517
  { 16182956370781059300u, 2263919769706678091u }, {  7808504722524468110u, 1414949856066673807u },
518
  {  5148944884728197234u, 1768687320083342259u }, {  1824495087482858639u, 2210859150104177824u },
519
  {  1140309429676786649u, 1381786968815111140u }, {  1425386787095983311u, 1727233711018888925u },
520
  {  6393419502297367043u, 2159042138773611156u }, { 13219259225790630210u, 1349401336733506972u },
521
  { 16524074032238287762u, 1686751670916883715u }, { 16043406521870471799u, 2108439588646104644u },
522
  {   803757039314269066u, 1317774742903815403u }, { 14839754354425000045u, 1647218428629769253u },
523
  {  4714634887749086344u, 2059023035787211567u }, {  9864175832484260821u, 1286889397367007229u },
524
  { 16941905809032713930u, 1608611746708759036u }, {  2730638187581340797u, 2010764683385948796u },
525
  { 10930020904093113806u, 1256727927116217997u }, { 18274212148543780162u, 1570909908895272496u },
526
  {  4396021111970173586u, 1963637386119090621u }, {  5053356204195052443u, 1227273366324431638u },
527
  { 15540067292098591362u, 1534091707905539547u }, { 14813398096695851299u, 1917614634881924434u },
528
  { 13870059828862294966u, 1198509146801202771u }, { 12725888767650480803u, 1498136433501503464u },
529
  { 15907360959563101004u, 1872670541876879330u }, { 14553786618154326031u, 1170419088673049581u },
530
  {  4357175217410743827u, 1463023860841311977u }, { 10058155040190817688u, 1828779826051639971u },
531
  {  7961007781811134206u, 2285974782564549964u }, { 14199001900486734687u, 1428734239102843727u },
532
  { 13137066357181030455u, 1785917798878554659u }, { 11809646928048900164u, 2232397248598193324u },
533
  { 16604401366885338411u, 1395248280373870827u }, { 16143815690179285109u, 1744060350467338534u },
534
  { 10956397575869330579u, 2180075438084173168u }, {  6847748484918331612u, 1362547148802608230u },
535
  { 17783057643002690323u, 1703183936003260287u }, { 17617136035325974999u, 2128979920004075359u },
536
  { 17928239049719816230u, 1330612450002547099u }, { 17798612793722382384u, 1663265562503183874u },
537
  { 13024893955298202172u, 2079081953128979843u }, {  5834715712847682405u, 1299426220705612402u },
538
  { 16516766677914378815u, 1624282775882015502u }, { 11422586310538197711u, 2030353469852519378u },
539
  { 11750802462513761473u, 1268970918657824611u }, { 10076817059714813937u, 1586213648322280764u },
540
  { 12596021324643517422u, 1982767060402850955u }, {  5566670318688504437u, 1239229412751781847u },
541
  {  2346651879933242642u, 1549036765939727309u }, {  7545000868343941206u, 1936295957424659136u },
542
  {  4715625542714963254u, 1210184973390411960u }, {  5894531928393704067u, 1512731216738014950u },
543
  { 16591536947346905892u, 1890914020922518687u }, { 17287239619732898039u, 1181821263076574179u },
544
  { 16997363506238734644u, 1477276578845717724u }, {  2799960309088866689u, 1846595723557147156u },
545
  { 10973347230035317489u, 1154122327223216972u }, { 13716684037544146861u, 1442652909029021215u },
546
  { 12534169028502795672u, 1803316136286276519u }, { 11056025267201106687u, 2254145170357845649u },
547
  { 18439230838069161439u, 1408840731473653530u }, { 13825666510731675991u, 1761050914342066913u },
548
  {  3447025083132431277u, 2201313642927583642u }, {  6766076695385157452u, 1375821026829739776u },
549
  {  8457595869231446815u, 1719776283537174720u }, { 10571994836539308519u, 2149720354421468400u },
550
  {  6607496772837067824u, 1343575221513417750u }, { 17482743002901110588u, 1679469026891772187u },
551
  { 17241742735199000331u, 2099336283614715234u }, { 15387775227926763111u, 1312085177259197021u },
552
  {  5399660979626290177u, 1640106471573996277u }, { 11361262242960250625u, 2050133089467495346u },
553
  { 11712474920277544544u, 1281333180917184591u }, { 10028907631919542777u, 1601666476146480739u },
554
  {  7924448521472040567u, 2002083095183100924u }, { 14176152362774801162u, 1251301934489438077u },
555
  {  3885132398186337741u, 1564127418111797597u }, {  9468101516160310080u, 1955159272639746996u },
556
  { 15140935484454969608u, 1221974545399841872u }, {   479425281859160394u, 1527468181749802341u },
557
  {  5210967620751338397u, 1909335227187252926u }, { 17091912818251750210u, 1193334516992033078u },
558
  { 12141518985959911954u, 1491668146240041348u }, { 15176898732449889943u, 1864585182800051685u },
559
  { 11791404716994875166u, 1165365739250032303u }, { 10127569877816206054u, 1456707174062540379u },
560
  {  8047776328842869663u, 1820883967578175474u }, {   836348374198811271u, 2276104959472719343u },
561
  {  7440246761515338900u, 1422565599670449589u }, { 13911994470321561530u, 1778206999588061986u },
562
  {  8166621051047176104u, 2222758749485077483u }, {  2798295147690791113u, 1389224218428173427u },
563
  { 17332926989895652603u, 1736530273035216783u }, { 17054472718942177850u, 2170662841294020979u },
564
  {  8353202440125167204u, 1356664275808763112u }, { 10441503050156459005u, 1695830344760953890u },
565
  {  3828506775840797949u, 2119787930951192363u }, {    86973725686804766u, 1324867456844495227u },
566
  { 13943775212390669669u, 1656084321055619033u }, {  3594660960206173375u, 2070105401319523792u },
567
  {  2246663100128858359u, 1293815875824702370u }, { 12031700912015848757u, 1617269844780877962u },
568
  {  5816254103165035138u, 2021587305976097453u }, {  5941001823691840913u, 1263492066235060908u },
569
  {  7426252279614801142u, 1579365082793826135u }, {  4671129331091113523u, 1974206353492282669u },
570
  {  5225298841145639904u, 1233878970932676668u }, {  6531623551432049880u, 1542348713665845835u },
571
  {  3552843420862674446u, 1927935892082307294u }, { 16055585193321335241u, 1204959932551442058u },
572
  { 10846109454796893243u, 1506199915689302573u }, { 18169322836923504458u, 1882749894611628216u },
573
  { 11355826773077190286u, 1176718684132267635u }, {  9583097447919099954u, 1470898355165334544u },
574
  { 11978871809898874942u, 1838622943956668180u }, { 14973589762373593678u, 2298278679945835225u },
575
  {  2440964573842414192u, 1436424174966147016u }, {  3051205717303017741u, 1795530218707683770u },
576
  { 13037379183483547984u, 2244412773384604712u }, {  8148361989677217490u, 1402757983365377945u },
577
  { 14797138505523909766u, 1753447479206722431u }, { 13884737113477499304u, 2191809349008403039u },
578
  { 15595489723564518921u, 1369880843130251899u }, { 14882676136028260747u, 1712351053912814874u },
579
  {  9379973133180550126u, 2140438817391018593u }, { 17391698254306313589u, 1337774260869386620u },
580
  {  3292878744173340370u, 1672217826086733276u }, {  4116098430216675462u, 2090272282608416595u },
581
  {   266718509671728212u, 1306420176630260372u }, {   333398137089660265u, 1633025220787825465u },
582
  {  5028433689789463235u, 2041281525984781831u }, { 10060300083759496378u, 1275800953740488644u },
583
  { 12575375104699370472u, 1594751192175610805u }, {  1884160825592049379u, 1993438990219513507u },
584
  { 17318501580490888525u, 1245899368887195941u }, {  7813068920331446945u, 1557374211108994927u },
585
  {  5154650131986920777u, 1946717763886243659u }, {   915813323278131534u, 1216698602428902287u },
586
  { 14979824709379828129u, 1520873253036127858u }, {  9501408849870009354u, 1901091566295159823u },
587
  { 12855909558809837702u, 1188182228934474889u }, {  2234828893230133415u, 1485227786168093612u },
588
  {  2793536116537666769u, 1856534732710117015u }, {  8663489100477123587u, 1160334207943823134u },
589
  {  1605989338741628675u, 1450417759929778918u }, { 11230858710281811652u, 1813022199912223647u },
590
  {  9426887369424876662u, 2266277749890279559u }, { 12809333633531629769u, 1416423593681424724u },
591
  { 16011667041914537212u, 1770529492101780905u }, {  6179525747111007803u, 2213161865127226132u },
592
  { 13085575628799155685u, 1383226165704516332u }, { 16356969535998944606u, 1729032707130645415u },
593
  { 15834525901571292854u, 2161290883913306769u }, {  2979049660840976177u, 1350806802445816731u },
594
  { 17558870131333383934u, 1688508503057270913u }, {  8113529608884566205u, 2110635628821588642u },
595
  {  9682642023980241782u, 1319147268013492901u }, { 16714988548402690132u, 1648934085016866126u },
596
  { 11670363648648586857u, 2061167606271082658u }, { 11905663298832754689u, 1288229753919426661u },
597
  {  1047021068258779650u, 1610287192399283327u }, { 15143834390605638274u, 2012858990499104158u },
598
  {  4853210475701136017u, 1258036869061940099u }, {  1454827076199032118u, 1572546086327425124u },
599
  {  1818533845248790147u, 1965682607909281405u }, {  3442426662494187794u, 1228551629943300878u },
600
  { 13526405364972510550u, 1535689537429126097u }, {  3072948650933474476u, 1919611921786407622u },
601
  { 15755650962115585259u, 1199757451116504763u }, { 15082877684217093670u, 1499696813895630954u },
602
  {  9630225068416591280u, 1874621017369538693u }, {  8324733676974063502u, 1171638135855961683u },
603
  {  5794231077790191473u, 1464547669819952104u }, {  7242788847237739342u, 1830684587274940130u },
604
  { 18276858095901949986u, 2288355734093675162u }, { 16034722328366106645u, 1430222333808546976u },
605
  {  1596658836748081690u, 1787777917260683721u }, {  6607509564362490017u, 2234722396575854651u },
606
  {  1823850468512862308u, 1396701497859909157u }, {  6891499104068465790u, 1745876872324886446u },
607
  { 17837745916940358045u, 2182346090406108057u }, {  4231062170446641922u, 1363966306503817536u },
608
  {  5288827713058302403u, 1704957883129771920u }, {  6611034641322878003u, 2131197353912214900u },
609
  { 13355268687681574560u, 1331998346195134312u }, { 16694085859601968200u, 1664997932743917890u },
610
  { 11644235287647684442u, 2081247415929897363u }, {  4971804045566108824u, 1300779634956185852u },
611
  {  6214755056957636030u, 1625974543695232315u }, {  3156757802769657134u, 2032468179619040394u },
612
  {  6584659645158423613u, 1270292612261900246u }, { 17454196593302805324u, 1587865765327375307u },
613
  { 17206059723201118751u, 1984832206659219134u }, {  6142101308573311315u, 1240520129162011959u },
614
  {  3065940617289251240u, 1550650161452514949u }, {  8444111790038951954u, 1938312701815643686u },
615
  {   665883850346957067u, 1211445438634777304u }, {   832354812933696334u, 1514306798293471630u },
616
  { 10263815553021896226u, 1892883497866839537u }, { 17944099766707154901u, 1183052186166774710u },
617
  { 13206752671529167818u, 1478815232708468388u }, { 16508440839411459773u, 1848519040885585485u },
618
  { 12623618533845856310u, 1155324400553490928u }, { 15779523167307320387u, 1444155500691863660u },
619
  {  1277659885424598868u, 1805194375864829576u }, {  1597074856780748586u, 2256492969831036970u },
620
  {  5609857803915355770u, 1410308106144398106u }, { 16235694291748970521u, 1762885132680497632u },
621
  {  1847873790976661535u, 2203606415850622041u }, { 12684136165428883219u, 1377254009906638775u },
622
  { 11243484188358716120u, 1721567512383298469u }, {   219297180166231438u, 2151959390479123087u },
623
  {  7054589765244976505u, 1344974619049451929u }, { 13429923224983608535u, 1681218273811814911u },
624
  { 12175718012802122765u, 2101522842264768639u }, { 14527352785642408584u, 1313451776415480399u },
625
  { 13547504963625622826u, 1641814720519350499u }, { 12322695186104640628u, 2052268400649188124u },
626
  { 16925056528170176201u, 1282667750405742577u }, {  7321262604930556539u, 1603334688007178222u },
627
  { 18374950293017971482u, 2004168360008972777u }, {  4566814905495150320u, 1252605225005607986u },
628
  { 14931890668723713708u, 1565756531257009982u }, {  9441491299049866327u, 1957195664071262478u },
629
  {  1289246043478778550u, 1223247290044539049u }, {  6223243572775861092u, 1529059112555673811u },
630
  {  3167368447542438461u, 1911323890694592264u }, {  1979605279714024038u, 1194577431684120165u },
631
  {  7086192618069917952u, 1493221789605150206u }, { 18081112809442173248u, 1866527237006437757u },
632
  { 13606538515115052232u, 1166579523129023598u }, {  7784801107039039482u, 1458224403911279498u },
633
  {   507629346944023544u, 1822780504889099373u }, {  5246222702107417334u, 2278475631111374216u },
634
  {  3278889188817135834u, 1424047269444608885u }, {  8710297504448807696u, 1780059086805761106u }
635
};
636
637
// IEEE 754 double precision constants
638
371k
#define DOUBLE_MANTISSA_BITS 52
639
92.8k
#define DOUBLE_EXPONENT_BITS 11
640
185k
#define DOUBLE_EXPONENT_BIAS 1023
641
642
// Helper: floor(log2(value)) using ryu_leading_zeros64
643
186k
static inline uint32_t floor_log2(const uint64_t value) {
644
186k
  return 63 - ryu_leading_zeros64(value);
645
186k
}
646
647
// Helper: log2(5^e) approximation
648
186k
static inline int32_t log2pow5(const int32_t e) {
649
186k
  return (int32_t) ((((uint32_t) e) * 1217359) >> 19);
650
186k
}
651
652
// Helper: ceil(log2(5^e))
653
105k
static inline int32_t ceil_log2pow5(const int32_t e) {
654
105k
  return log2pow5(e) + 1;
655
105k
}
656
657
// Helper: max of two int32
658
93.1k
static inline int32_t max32(int32_t a, int32_t b) {
659
93.1k
  return a < b ? b : a;
660
93.1k
}
661
662
// Helper: convert uint64 bits to double
663
94.9k
static inline double int64Bits2Double(uint64_t bits) {
664
94.9k
  double f;
665
94.9k
  memcpy(&f, &bits, sizeof(double));
666
94.9k
  return f;
667
94.9k
}
668
669
// Check if value is multiple of 2^p
670
73.2k
static inline bool multipleOfPowerOf2(const uint64_t value, const uint32_t p) {
671
73.2k
  return (value & ((1ull << p) - 1)) == 0;
672
73.2k
}
673
674
// Count how many times value is divisible by 5
675
// Uses modular inverse to avoid expensive division
676
12.2k
static inline uint32_t pow5Factor(uint64_t value) {
677
12.2k
  const uint64_t m_inv_5 = 14757395258967641293u; // 5 * m_inv_5 = 1 (mod 2^64)
678
12.2k
  const uint64_t n_div_5 = 3689348814741910323u;  // 2^64 / 5
679
12.2k
  uint32_t count = 0;
680
22.6k
  for (;;) {
681
22.6k
    value *= m_inv_5;
682
22.6k
    if (value > n_div_5)
683
12.2k
      break;
684
10.4k
    ++count;
685
10.4k
  }
686
12.2k
  return count;
687
12.2k
}
688
689
// Check if value is multiple of 5^p
690
// Optimized: uses modular inverse instead of division
691
12.2k
static inline bool multipleOfPowerOf5(const uint64_t value, const uint32_t p) {
692
12.2k
  return pow5Factor(value) >= p;
693
12.2k
}
694
695
// 128-bit multiplication with shift
696
// This is the core operation for converting decimal to binary
697
#if defined(__SIZEOF_INT128__)
698
// Use native 128-bit integers if available (GCC/Clang)
699
93.1k
static inline uint64_t mulShift64(const uint64_t m, const uint64_t* const mul, const int32_t j) {
700
93.1k
  const unsigned __int128 b0 = ((unsigned __int128) m) * mul[0];
701
93.1k
  const unsigned __int128 b2 = ((unsigned __int128) m) * mul[1];
702
93.1k
  return (uint64_t) (((b0 >> 64) + b2) >> (j - 64));
703
93.1k
}
704
#else
705
// Fallback for systems without 128-bit integers
706
static inline uint64_t umul128(const uint64_t a, const uint64_t b, uint64_t* const productHi) {
707
  const uint32_t aLo = (uint32_t)a;
708
  const uint32_t aHi = (uint32_t)(a >> 32);
709
  const uint32_t bLo = (uint32_t)b;
710
  const uint32_t bHi = (uint32_t)(b >> 32);
711
712
  const uint64_t b00 = (uint64_t)aLo * bLo;
713
  const uint64_t b01 = (uint64_t)aLo * bHi;
714
  const uint64_t b10 = (uint64_t)aHi * bLo;
715
  const uint64_t b11 = (uint64_t)aHi * bHi;
716
717
  const uint32_t b00Lo = (uint32_t)b00;
718
  const uint32_t b00Hi = (uint32_t)(b00 >> 32);
719
720
  const uint64_t mid1 = b10 + b00Hi;
721
  const uint32_t mid1Lo = (uint32_t)(mid1);
722
  const uint32_t mid1Hi = (uint32_t)(mid1 >> 32);
723
724
  const uint64_t mid2 = b01 + mid1Lo;
725
  const uint32_t mid2Lo = (uint32_t)(mid2);
726
  const uint32_t mid2Hi = (uint32_t)(mid2 >> 32);
727
728
  const uint64_t pHi = b11 + mid1Hi + mid2Hi;
729
  const uint64_t pLo = ((uint64_t)mid2Lo << 32) | b00Lo;
730
731
  *productHi = pHi;
732
  return pLo;
733
}
734
735
static inline uint64_t shiftright128(const uint64_t lo, const uint64_t hi, const uint32_t dist) {
736
  return (hi << (64 - dist)) | (lo >> dist);
737
}
738
739
static inline uint64_t mulShift64(const uint64_t m, const uint64_t* const mul, const int32_t j) {
740
  uint64_t high1;
741
  const uint64_t low1 = umul128(m, mul[1], &high1);
742
  uint64_t high0;
743
  umul128(m, mul[0], &high0);
744
  const uint64_t sum = high0 + low1;
745
  if (sum < high0) {
746
    ++high1;
747
  }
748
  return shiftright128(sum, high1, j - 64);
749
}
750
#endif
751
752
// Main conversion function: decimal mantissa+exponent to IEEE 754 double
753
// Optimized for JSON parsing with fast paths for edge cases
754
94.9k
static inline double ryu_s2d_from_parts(uint64_t m10, int m10digits, int32_t e10, bool signedM) {
755
  // Fast path: handle zero explicitly (e.g., "0.0", "0e0")
756
94.9k
  if (m10 == 0) {
757
754
    return int64Bits2Double(((uint64_t) signedM) << 63);
758
754
  }
759
760
  // Fast path: handle overflow/underflow early
761
94.1k
  if (m10digits + e10 <= -324) {
762
    // Underflow to zero
763
1
    return int64Bits2Double(((uint64_t) signedM) << 63);
764
1
  }
765
766
94.1k
  if (m10digits + e10 >= 310) {
767
    // Overflow to infinity
768
1.02k
    return int64Bits2Double((((uint64_t) signedM) << 63) | 0x7ff0000000000000ULL);
769
1.02k
  }
770
771
  // Convert decimal to binary: m10 * 10^e10 = m2 * 2^e2
772
93.1k
  int32_t e2;
773
93.1k
  uint64_t m2;
774
93.1k
  bool trailingZeros;
775
776
93.1k
  if (e10 >= 0) {
777
    // Positive exponent: multiply by 5^e10 and adjust binary exponent
778
80.9k
    e2 = floor_log2(m10) + e10 + log2pow5(e10) - (DOUBLE_MANTISSA_BITS + 1);
779
80.9k
    int j = e2 - e10 - ceil_log2pow5(e10) + DOUBLE_POW5_BITCOUNT;
780
80.9k
    m2 = mulShift64(m10, DOUBLE_POW5_SPLIT[e10], j);
781
80.9k
    trailingZeros = e2 < e10 || (e2 - e10 < 64 && multipleOfPowerOf2(m10, e2 - e10));
782
80.9k
  } else {
783
    // Negative exponent: divide by 5^(-e10)
784
12.2k
    e2 = floor_log2(m10) + e10 - ceil_log2pow5(-e10) - (DOUBLE_MANTISSA_BITS + 1);
785
12.2k
    int j = e2 - e10 + ceil_log2pow5(-e10) - 1 + DOUBLE_POW5_INV_BITCOUNT;
786
12.2k
    m2 = mulShift64(m10, DOUBLE_POW5_INV_SPLIT[-e10], j);
787
12.2k
    trailingZeros = multipleOfPowerOf5(m10, -e10);
788
12.2k
  }
789
790
  // Compute IEEE 754 exponent
791
93.1k
  uint32_t ieee_e2 = (uint32_t) max32(0, e2 + DOUBLE_EXPONENT_BIAS + floor_log2(m2));
792
793
93.1k
  if (ieee_e2 > 0x7fe) {
794
    // Overflow to infinity
795
296
    return int64Bits2Double((((uint64_t) signedM) << 63) | 0x7ff0000000000000ULL);
796
296
  }
797
798
  // Compute shift amount for rounding
799
92.8k
  int32_t shift = (ieee_e2 == 0 ? 1 : ieee_e2) - e2 - DOUBLE_EXPONENT_BIAS - DOUBLE_MANTISSA_BITS;
800
801
  // IEEE 754 round-to-even (banker's rounding)
802
92.8k
  trailingZeros &= (m2 & ((1ull << (shift - 1)) - 1)) == 0;
803
92.8k
  uint64_t lastRemovedBit = (m2 >> (shift - 1)) & 1;
804
92.8k
  bool roundUp = (lastRemovedBit != 0) && (!trailingZeros || (((m2 >> shift) & 1) != 0));
805
806
92.8k
  uint64_t ieee_m2 = (m2 >> shift) + roundUp;
807
92.8k
  ieee_m2 &= (1ull << DOUBLE_MANTISSA_BITS) - 1;
808
809
92.8k
  if (ieee_m2 == 0 && roundUp) {
810
207
    ieee_e2++;
811
207
  }
812
813
  // Pack sign, exponent, and mantissa into IEEE 754 format
814
  // Match original Ryu: group sign+exponent, then shift and add mantissa
815
92.8k
  uint64_t ieee = (((((uint64_t) signedM) << DOUBLE_EXPONENT_BITS) | (uint64_t)ieee_e2) << DOUBLE_MANTISSA_BITS) | ieee_m2;
816
92.8k
  return int64Bits2Double(ieee);
817
93.1k
}
818
819
#endif // RYU_H