qr_reader-native 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE-mruby.txt +22 -0
- data/LICENSE-spinel.txt +19 -0
- data/LICENSE.txt +21 -0
- data/README.md +61 -0
- data/ext/qr_reader_native/SPINEL_VERSION +1 -0
- data/ext/qr_reader_native/extconf.rb +8 -0
- data/ext/qr_reader_native/mruby/error.h +13 -0
- data/ext/qr_reader_native/mruby/internal.h +145 -0
- data/ext/qr_reader_native/mruby/string.h +22 -0
- data/ext/qr_reader_native/mruby.h +93 -0
- data/ext/qr_reader_native/mruby_shim.h +118 -0
- data/ext/qr_reader_native/qr_reader_native.c +13513 -0
- data/ext/qr_reader_native/qr_reader_native.h +29 -0
- data/ext/qr_reader_native/qr_reader_native_ext.c +598 -0
- data/ext/qr_reader_native/re_cased.h +71 -0
- data/ext/qr_reader_native/re_compile.c +5784 -0
- data/ext/qr_reader_native/re_ctype.h +3540 -0
- data/ext/qr_reader_native/re_exec.c +2190 -0
- data/ext/qr_reader_native/re_internal.h +671 -0
- data/ext/qr_reader_native/re_prop.h +4629 -0
- data/ext/qr_reader_native/re_spinel.c +363 -0
- data/ext/qr_reader_native/re_spinel.h +22 -0
- data/ext/qr_reader_native/re_spinel_utf8.inc +97 -0
- data/ext/qr_reader_native/re_utf8.c +156 -0
- data/ext/qr_reader_native/sp_alloc.c +1447 -0
- data/ext/qr_reader_native/sp_alloc.h +1196 -0
- data/ext/qr_reader_native/sp_argf.h +33 -0
- data/ext/qr_reader_native/sp_array.c +1052 -0
- data/ext/qr_reader_native/sp_array.h +456 -0
- data/ext/qr_reader_native/sp_bigint.c +5826 -0
- data/ext/qr_reader_native/sp_bigint.h +117 -0
- data/ext/qr_reader_native/sp_cold.c +5259 -0
- data/ext/qr_reader_native/sp_compat.h +402 -0
- data/ext/qr_reader_native/sp_core.c +818 -0
- data/ext/qr_reader_native/sp_core.h +56 -0
- data/ext/qr_reader_native/sp_crypto.c +877 -0
- data/ext/qr_reader_native/sp_crypto.h +169 -0
- data/ext/qr_reader_native/sp_dtoa.c +1533 -0
- data/ext/qr_reader_native/sp_dtoa.h +29 -0
- data/ext/qr_reader_native/sp_encoding_names.h +172 -0
- data/ext/qr_reader_native/sp_enum.h +86 -0
- data/ext/qr_reader_native/sp_exc.c +1185 -0
- data/ext/qr_reader_native/sp_exc.h +186 -0
- data/ext/qr_reader_native/sp_exc_ctx.h +56 -0
- data/ext/qr_reader_native/sp_fiber.c +889 -0
- data/ext/qr_reader_native/sp_fiber.h +162 -0
- data/ext/qr_reader_native/sp_fiber_ctx.h +84 -0
- data/ext/qr_reader_native/sp_format.c +695 -0
- data/ext/qr_reader_native/sp_format.h +83 -0
- data/ext/qr_reader_native/sp_gc.c +1793 -0
- data/ext/qr_reader_native/sp_gc.h +762 -0
- data/ext/qr_reader_native/sp_hash.c +131 -0
- data/ext/qr_reader_native/sp_hash.h +131 -0
- data/ext/qr_reader_native/sp_inspect.c +215 -0
- data/ext/qr_reader_native/sp_inspect.h +128 -0
- data/ext/qr_reader_native/sp_io.c +1676 -0
- data/ext/qr_reader_native/sp_io.h +272 -0
- data/ext/qr_reader_native/sp_iobuffer.c +1014 -0
- data/ext/qr_reader_native/sp_iobuffer.h +167 -0
- data/ext/qr_reader_native/sp_marshal.c +487 -0
- data/ext/qr_reader_native/sp_marshal.h +60 -0
- data/ext/qr_reader_native/sp_net.c +1029 -0
- data/ext/qr_reader_native/sp_net.h +205 -0
- data/ext/qr_reader_native/sp_pack.c +1254 -0
- data/ext/qr_reader_native/sp_poly_cold.c +1220 -0
- data/ext/qr_reader_native/sp_proc.c +410 -0
- data/ext/qr_reader_native/sp_proc.h +327 -0
- data/ext/qr_reader_native/sp_process.c +547 -0
- data/ext/qr_reader_native/sp_process_status.c +211 -0
- data/ext/qr_reader_native/sp_process_status.h +66 -0
- data/ext/qr_reader_native/sp_random.c +287 -0
- data/ext/qr_reader_native/sp_random.h +52 -0
- data/ext/qr_reader_native/sp_range.h +144 -0
- data/ext/qr_reader_native/sp_re.c +1379 -0
- data/ext/qr_reader_native/sp_re.h +186 -0
- data/ext/qr_reader_native/sp_re_names.h +59 -0
- data/ext/qr_reader_native/sp_sched.c +4044 -0
- data/ext/qr_reader_native/sp_sched.h +295 -0
- data/ext/qr_reader_native/sp_slab.c +1507 -0
- data/ext/qr_reader_native/sp_str.c +1462 -0
- data/ext/qr_reader_native/sp_str.h +306 -0
- data/ext/qr_reader_native/sp_str_crypt.c +23 -0
- data/ext/qr_reader_native/sp_string.c +92 -0
- data/ext/qr_reader_native/sp_string.h +253 -0
- data/ext/qr_reader_native/sp_system.c +78 -0
- data/ext/qr_reader_native/sp_system.h +18 -0
- data/ext/qr_reader_native/sp_time.c +860 -0
- data/ext/qr_reader_native/sp_time.h +100 -0
- data/ext/qr_reader_native/sp_types.h +292 -0
- data/ext/qr_reader_native/spinel_rt.h +19017 -0
- data/ext/qr_reader_native/unicase.c +399 -0
- data/ext/qr_reader_native/unicase.h +901 -0
- data/lib/qr_reader/native.rb +6 -0
- metadata +153 -0
|
@@ -0,0 +1,1533 @@
|
|
|
1
|
+
/*
|
|
2
|
+
** sp_dtoa.c - locale-independent float conversion (see sp_dtoa.h).
|
|
3
|
+
**
|
|
4
|
+
** Unrounded Scaling float format/parse, from mruby's fp_uscale.c
|
|
5
|
+
** (Russ Cox, https://research.swtch.com/fp). Adapted for spinel: the
|
|
6
|
+
** mruby.h dependency is replaced with spinel's types + local ctype
|
|
7
|
+
** macros; the two entry points are renamed sp_format_float /
|
|
8
|
+
** sp_read_float. Pure integer arithmetic, no locale-sensitive libc.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
#include "sp_dtoa.h"
|
|
12
|
+
#include <ctype.h>
|
|
13
|
+
#define ISSPACE(c) isspace((unsigned char)(c))
|
|
14
|
+
#define ISDIGIT(c) isdigit((unsigned char)(c))
|
|
15
|
+
|
|
16
|
+
#ifndef MRB_NO_FLOAT
|
|
17
|
+
|
|
18
|
+
#include <string.h>
|
|
19
|
+
#include <math.h>
|
|
20
|
+
#include <stdint.h>
|
|
21
|
+
|
|
22
|
+
/* ======== Platform support ======== */
|
|
23
|
+
|
|
24
|
+
#if defined(__SIZEOF_INT128__)
|
|
25
|
+
static inline void mul64(uint64_t a, uint64_t b, uint64_t *hi, uint64_t *lo)
|
|
26
|
+
{
|
|
27
|
+
__uint128_t r = (__uint128_t)a * b;
|
|
28
|
+
*hi = (uint64_t)(r >> 64);
|
|
29
|
+
*lo = (uint64_t)r;
|
|
30
|
+
}
|
|
31
|
+
#elif defined(_MSC_VER) && defined(_M_X64)
|
|
32
|
+
#include <intrin.h>
|
|
33
|
+
static inline void mul64(uint64_t a, uint64_t b, uint64_t *hi, uint64_t *lo)
|
|
34
|
+
{
|
|
35
|
+
*lo = _umul128(a, b, hi);
|
|
36
|
+
}
|
|
37
|
+
#else
|
|
38
|
+
static inline void mul64(uint64_t a, uint64_t b, uint64_t *hi, uint64_t *lo)
|
|
39
|
+
{
|
|
40
|
+
uint64_t a_lo = (uint32_t)a, a_hi = a >> 32;
|
|
41
|
+
uint64_t b_lo = (uint32_t)b, b_hi = b >> 32;
|
|
42
|
+
uint64_t p0 = a_lo * b_lo;
|
|
43
|
+
uint64_t p1 = a_lo * b_hi;
|
|
44
|
+
uint64_t p2 = a_hi * b_lo;
|
|
45
|
+
uint64_t p3 = a_hi * b_hi;
|
|
46
|
+
uint64_t mid = (p0 >> 32) + (uint32_t)p1 + (uint32_t)p2;
|
|
47
|
+
*lo = (p0 & 0xFFFFFFFFULL) | (mid << 32);
|
|
48
|
+
*hi = p3 + (p1 >> 32) + (p2 >> 32) + (mid >> 32);
|
|
49
|
+
}
|
|
50
|
+
#endif
|
|
51
|
+
|
|
52
|
+
#if defined(__GNUC__) || defined(__clang__)
|
|
53
|
+
#define clz64(x) __builtin_clzll(x)
|
|
54
|
+
#elif defined(_MSC_VER) && defined(_M_X64)
|
|
55
|
+
static inline int clz64(uint64_t x)
|
|
56
|
+
{
|
|
57
|
+
unsigned long idx;
|
|
58
|
+
_BitScanReverse64(&idx, x);
|
|
59
|
+
return 63 - (int)idx;
|
|
60
|
+
}
|
|
61
|
+
#else
|
|
62
|
+
static inline int clz64(uint64_t x)
|
|
63
|
+
{
|
|
64
|
+
int n = 0;
|
|
65
|
+
if (x <= 0x00000000FFFFFFFFULL) { n += 32; x <<= 32; }
|
|
66
|
+
if (x <= 0x0000FFFFFFFFFFFFULL) { n += 16; x <<= 16; }
|
|
67
|
+
if (x <= 0x00FFFFFFFFFFFFFFULL) { n += 8; x <<= 8; }
|
|
68
|
+
if (x <= 0x0FFFFFFFFFFFFFFFULL) { n += 4; x <<= 4; }
|
|
69
|
+
if (x <= 0x3FFFFFFFFFFFFFFFULL) { n += 2; x <<= 2; }
|
|
70
|
+
if (x <= 0x7FFFFFFFFFFFFFFFULL) { n += 1; }
|
|
71
|
+
return n;
|
|
72
|
+
}
|
|
73
|
+
#endif
|
|
74
|
+
|
|
75
|
+
#define bits_len64(x) (64 - clz64(x))
|
|
76
|
+
|
|
77
|
+
/* ======== pow10 table ======== */
|
|
78
|
+
|
|
79
|
+
typedef struct {
|
|
80
|
+
uint64_t hi;
|
|
81
|
+
uint64_t lo;
|
|
82
|
+
} pow10_entry;
|
|
83
|
+
|
|
84
|
+
#define POW10_MIN (-343)
|
|
85
|
+
#define POW10_MAX 341
|
|
86
|
+
#define POW10_TAB_SIZE (POW10_MAX - POW10_MIN + 1)
|
|
87
|
+
|
|
88
|
+
/* generated by tools/gen_pow10_tab.rb */
|
|
89
|
+
static const pow10_entry pow10_tab[POW10_TAB_SIZE] = {
|
|
90
|
+
{0xbf29dcaba82fdeafULL, 0x8bcd1178c77f03ccULL},
|
|
91
|
+
{0xeef453d6923bd65bULL, 0xeec055d6f95ec4c0ULL},
|
|
92
|
+
{0x9558b4661b6565f9ULL, 0xb53835a65bdb3af8ULL},
|
|
93
|
+
{0xbaaee17fa23ebf77ULL, 0xa286430ff2d209b6ULL},
|
|
94
|
+
{0xe95a99df8ace6f54ULL, 0x0b27d3d3ef868c23ULL},
|
|
95
|
+
{0x91d8a02bb6c10595ULL, 0x86f8e46475b41796ULL},
|
|
96
|
+
{0xb64ec836a47146faULL, 0x68b71d7d93211d7bULL},
|
|
97
|
+
{0xe3e27a444d8d98b8ULL, 0x02e4e4dcf7e964daULL},
|
|
98
|
+
{0x8e6d8c6ab0787f73ULL, 0x01cf0f0a1af1df08ULL},
|
|
99
|
+
{0xb208ef855c969f50ULL, 0x4242d2cca1ae56caULL},
|
|
100
|
+
{0xde8b2b66b3bc4724ULL, 0x52d3877fca19ec7dULL},
|
|
101
|
+
{0x8b16fb203055ac77ULL, 0xb3c434afde5033ceULL},
|
|
102
|
+
{0xaddcb9e83c6b1794ULL, 0x20b541dbd5e440c2ULL},
|
|
103
|
+
{0xd953e8624b85dd79ULL, 0x28e29252cb5d50f2ULL},
|
|
104
|
+
{0x87d4713d6f33aa6cULL, 0x798d9b73bf1a5297ULL},
|
|
105
|
+
{0xa9c98d8ccb009507ULL, 0x97f10250aee0e73dULL},
|
|
106
|
+
{0xd43bf0effdc0ba49ULL, 0xfded42e4da99210dULL},
|
|
107
|
+
{0x84a57695fe98746eULL, 0xfeb449cf089fb4a8ULL},
|
|
108
|
+
{0xa5ced43b7e3e9189ULL, 0xbe615c42cac7a1d2ULL},
|
|
109
|
+
{0xcf42894a5dce35ebULL, 0xadf9b3537d798a46ULL},
|
|
110
|
+
{0x818995ce7aa0e1b3ULL, 0x8cbc10142e6bf66cULL},
|
|
111
|
+
{0xa1ebfb4219491a20ULL, 0xefeb14193a06f407ULL},
|
|
112
|
+
{0xca66fa129f9b60a7ULL, 0x2be5d91f8888b109ULL},
|
|
113
|
+
{0xfd00b897478238d1ULL, 0x76df4f676aaadd4bULL},
|
|
114
|
+
{0x9e20735e8cb16383ULL, 0xaa4b91a0a2aaca4fULL},
|
|
115
|
+
{0xc5a890362fddbc63ULL, 0x14de7608cb557ce2ULL},
|
|
116
|
+
{0xf712b443bbd52b7cULL, 0x5a16138afe2adc1bULL},
|
|
117
|
+
{0x9a6bb0aa55653b2eULL, 0xb84dcc36dedac991ULL},
|
|
118
|
+
{0xc1069cd4eabe89f9ULL, 0x66613f4496917bf5ULL},
|
|
119
|
+
{0xf148440a256e2c77ULL, 0x3ff98f15bc35daf2ULL},
|
|
120
|
+
{0x96cd2a865764dbcbULL, 0xc7fbf96d95a1a8d7ULL},
|
|
121
|
+
{0xbc807527ed3e12bdULL, 0x39faf7c8fb0a130dULL},
|
|
122
|
+
{0xeba09271e88d976cULL, 0x0879b5bb39cc97d1ULL},
|
|
123
|
+
{0x93445b8731587ea4ULL, 0x854c1195041fdee2ULL},
|
|
124
|
+
{0xb8157268fdae9e4dULL, 0xa69f15fa4527d69bULL},
|
|
125
|
+
{0xe61acf033d1a45e0ULL, 0x9046db78d671cc42ULL},
|
|
126
|
+
{0x8fd0c16206306bacULL, 0x5a2c492b86071fa9ULL},
|
|
127
|
+
{0xb3c4f1ba87bc8697ULL, 0x70b75b766788e793ULL},
|
|
128
|
+
{0xe0b62e2929aba83dULL, 0xcce53254016b2178ULL},
|
|
129
|
+
{0x8c71dcd9ba0b4926ULL, 0x600f3f7480e2f4ebULL},
|
|
130
|
+
{0xaf8e5410288e1b70ULL, 0xf8130f51a11bb226ULL},
|
|
131
|
+
{0xdb71e91432b1a24bULL, 0x3617d32609629eafULL},
|
|
132
|
+
{0x892731ac9faf056fULL, 0x41cee3f7c5dda32dULL},
|
|
133
|
+
{0xab70fe17c79ac6cbULL, 0x92429cf5b7550bf9ULL},
|
|
134
|
+
{0xd64d3d9db981787eULL, 0xf6d34433252a4ef7ULL},
|
|
135
|
+
{0x85f0468293f0eb4fULL, 0xda440a9ff73a715aULL},
|
|
136
|
+
{0xa76c582338ed2622ULL, 0x50d50d47f5090db1ULL},
|
|
137
|
+
{0xd1476e2c07286fabULL, 0xe50a5099f24b511eULL},
|
|
138
|
+
{0x82cca4db847945cbULL, 0xaf267260376f12b2ULL},
|
|
139
|
+
{0xa37fce126597973dULL, 0x1af00ef8454ad75fULL},
|
|
140
|
+
{0xcc5fc196fefd7d0dULL, 0xe1ac12b6569d8d37ULL},
|
|
141
|
+
{0xff77b1fcbebcdc50ULL, 0xda171763ec44f085ULL},
|
|
142
|
+
{0x9faacf3df73609b2ULL, 0x884e6e9e73ab1653ULL},
|
|
143
|
+
{0xc795830d75038c1eULL, 0x2a620a461095dbe8ULL},
|
|
144
|
+
{0xf97ae3d0d2446f26ULL, 0xb4fa8cd794bb52e2ULL},
|
|
145
|
+
{0x9becce62836ac578ULL, 0xb11c9806bcf513cdULL},
|
|
146
|
+
{0xc2e801fb244576d6ULL, 0xdd63be086c3258c0ULL},
|
|
147
|
+
{0xf3a20279ed56d48bULL, 0x94bcad8a873eeef0ULL},
|
|
148
|
+
{0x9845418c345644d7ULL, 0x7cf5ec7694875556ULL},
|
|
149
|
+
{0xbe5691ef416bd60dULL, 0xdc33679439a92aacULL},
|
|
150
|
+
{0xedec366b11c6cb90ULL, 0xd340417948137557ULL},
|
|
151
|
+
{0x94b3a202eb1c3f3aULL, 0x840828ebcd0c2956ULL},
|
|
152
|
+
{0xb9e08a83a5e34f08ULL, 0x250a3326c04f33acULL},
|
|
153
|
+
{0xe858ad248f5c22caULL, 0x2e4cbff070630097ULL},
|
|
154
|
+
{0x91376c36d99995bfULL, 0xdceff7f6463de05eULL},
|
|
155
|
+
{0xb58547448ffffb2eULL, 0x542bf5f3d7cd5875ULL},
|
|
156
|
+
{0xe2e69915b3fff9faULL, 0xe936f370cdc0ae93ULL},
|
|
157
|
+
{0x8dd01fad907ffc3cULL, 0x51c2582680986d1cULL},
|
|
158
|
+
{0xb1442798f49ffb4bULL, 0x6632ee3020be8863ULL},
|
|
159
|
+
{0xdd95317f31c7fa1eULL, 0xbfbfa9bc28ee2a7cULL},
|
|
160
|
+
{0x8a7d3eef7f1cfc53ULL, 0xb7d7ca159994da8dULL},
|
|
161
|
+
{0xad1c8eab5ee43b67ULL, 0x25cdbc9afffa1130ULL},
|
|
162
|
+
{0xd863b256369d4a41ULL, 0x6f412bc1bff8957dULL},
|
|
163
|
+
{0x873e4f75e2224e69ULL, 0xa588bb5917fb5d6eULL},
|
|
164
|
+
{0xa90de3535aaae203ULL, 0x8eeaea2f5dfa34c9ULL},
|
|
165
|
+
{0xd3515c2831559a84ULL, 0xf2a5a4bb3578c1fcULL},
|
|
166
|
+
{0x8412d9991ed58092ULL, 0x17a786f5016b793dULL},
|
|
167
|
+
{0xa5178fff668ae0b7ULL, 0x9d9168b241c6578dULL},
|
|
168
|
+
{0xce5d73ff402d98e4ULL, 0x04f5c2ded237ed70ULL},
|
|
169
|
+
{0x80fa687f881c7f8fULL, 0x831999cb4362f466ULL},
|
|
170
|
+
{0xa139029f6a239f73ULL, 0xe3e0003e143bb17fULL},
|
|
171
|
+
{0xc987434744ac874fULL, 0x5cd8004d994a9ddfULL},
|
|
172
|
+
{0xfbe9141915d7a923ULL, 0xb40e0060ff9d4557ULL},
|
|
173
|
+
{0x9d71ac8fada6c9b6ULL, 0x9088c03c9fc24b56ULL},
|
|
174
|
+
{0xc4ce17b399107c23ULL, 0x34aaf04bc7b2de2cULL},
|
|
175
|
+
{0xf6019da07f549b2cULL, 0x81d5ac5eb99f95b7ULL},
|
|
176
|
+
{0x99c102844f94e0fcULL, 0xd1258bbb3403bd92ULL},
|
|
177
|
+
{0xc0314325637a193aULL, 0x056eeeaa0104acf7ULL},
|
|
178
|
+
{0xf03d93eebc589f89ULL, 0x86caaa548145d835ULL},
|
|
179
|
+
{0x96267c7535b763b6ULL, 0xb43eaa74d0cba721ULL},
|
|
180
|
+
{0xbbb01b9283253ca3ULL, 0x614e551204fe90e9ULL},
|
|
181
|
+
{0xea9c227723ee8bccULL, 0xb9a1ea56863e3523ULL},
|
|
182
|
+
{0x92a1958a76751760ULL, 0xf405327613e6e136ULL},
|
|
183
|
+
{0xb749faed14125d37ULL, 0x31067f1398e09984ULL},
|
|
184
|
+
{0xe51c79a85916f485ULL, 0x7d481ed87f18bfe5ULL},
|
|
185
|
+
{0x8f31cc0937ae58d3ULL, 0x2e4d13474f6f77efULL},
|
|
186
|
+
{0xb2fe3f0b8599ef08ULL, 0x79e05819234b55eaULL},
|
|
187
|
+
{0xdfbdcece67006acaULL, 0x98586e1f6c1e2b65ULL},
|
|
188
|
+
{0x8bd6a141006042beULL, 0x1f3744d3a392db1fULL},
|
|
189
|
+
{0xaecc49914078536eULL, 0xa70516088c7791e7ULL},
|
|
190
|
+
{0xda7f5bf590966849ULL, 0x50c65b8aaf957661ULL},
|
|
191
|
+
{0x888f99797a5e012eULL, 0x927bf936adbd69fcULL},
|
|
192
|
+
{0xaab37fd7d8f58179ULL, 0x371af784592cc47cULL},
|
|
193
|
+
{0xd5605fcdcf32e1d7ULL, 0x04e1b5656f77f59bULL},
|
|
194
|
+
{0x855c3be0a17fcd27ULL, 0xa30d115f65aaf980ULL},
|
|
195
|
+
{0xa6b34ad8c9dfc070ULL, 0x0bd055b73f15b7e1ULL},
|
|
196
|
+
{0xd0601d8efc57b08cULL, 0x0ec46b250edb25d9ULL},
|
|
197
|
+
{0x823c12795db6ce58ULL, 0x893ac2f72948f7a7ULL},
|
|
198
|
+
{0xa2cb1717b52481eeULL, 0xab8973b4f39b3591ULL},
|
|
199
|
+
{0xcb7ddcdda26da269ULL, 0x566bd0a2308202f6ULL},
|
|
200
|
+
{0xfe5d54150b090b03ULL, 0x2c06c4cabca283b3ULL},
|
|
201
|
+
{0x9efa548d26e5a6e2ULL, 0x3b843afeb5e59250ULL},
|
|
202
|
+
{0xc6b8e9b0709f109bULL, 0xca6549be635ef6e4ULL},
|
|
203
|
+
{0xf867241c8cc6d4c1ULL, 0x3cfe9c2dfc36b49dULL},
|
|
204
|
+
{0x9b407691d7fc44f9ULL, 0x861f219cbda230e2ULL},
|
|
205
|
+
{0xc21094364dfb5637ULL, 0x67a6ea03ed0abd1bULL},
|
|
206
|
+
{0xf294b943e17a2bc5ULL, 0xc190a484e84d6c62ULL},
|
|
207
|
+
{0x979cf3ca6cec5b5bULL, 0x58fa66d3113063bdULL},
|
|
208
|
+
{0xbd8430bd08277232ULL, 0xaf390087d57c7cacULL},
|
|
209
|
+
{0xece53cec4a314ebeULL, 0x5b0740a9cadb9bd7ULL},
|
|
210
|
+
{0x940f4613ae5ed137ULL, 0x78e4886a1ec94166ULL},
|
|
211
|
+
{0xb913179899f68585ULL, 0xd71daa84a67b91c0ULL},
|
|
212
|
+
{0xe757dd7ec07426e6ULL, 0xcce51525d01a7630ULL},
|
|
213
|
+
{0x9096ea6f38489850ULL, 0xc00f2d37a21089deULL},
|
|
214
|
+
{0xb4bca50b065abe64ULL, 0xf012f8858a94ac56ULL},
|
|
215
|
+
{0xe1ebce4dc7f16dfcULL, 0x2c17b6a6ed39d76bULL},
|
|
216
|
+
{0x8d3360f09cf6e4beULL, 0x9b8ed228544426a3ULL},
|
|
217
|
+
{0xb080392cc4349dedULL, 0x427286b26955304cULL},
|
|
218
|
+
{0xdca04777f541c568ULL, 0x130f285f03aa7c5fULL},
|
|
219
|
+
{0x89e42caaf9491b61ULL, 0x0be9793b624a8dbbULL},
|
|
220
|
+
{0xac5d37d5b79b623aULL, 0xcee3d78a3add312aULL},
|
|
221
|
+
{0xd77485cb25823ac8ULL, 0x829ccd6cc9947d74ULL},
|
|
222
|
+
{0x86a8d39ef77164bdULL, 0x51a20063fdfcce68ULL},
|
|
223
|
+
{0xa8530886b54dbdecULL, 0x260a807cfd7c0203ULL},
|
|
224
|
+
{0xd267caa862a12d67ULL, 0x2f8d209c3cdb0284ULL},
|
|
225
|
+
{0x8380dea93da4bc61ULL, 0xbdb83461a608e192ULL},
|
|
226
|
+
{0xa46116538d0deb79ULL, 0xad26417a0f8b19f7ULL},
|
|
227
|
+
{0xcd795be870516657ULL, 0x986fd1d8936de074ULL},
|
|
228
|
+
{0x806bd9714632dff7ULL, 0xff45e3275c24ac49ULL},
|
|
229
|
+
{0xa086cfcd97bf97f4ULL, 0x7f175bf1332dd75bULL},
|
|
230
|
+
{0xc8a883c0fdaf7df1ULL, 0x9edd32ed7ff94d32ULL},
|
|
231
|
+
{0xfad2a4b13d1b5d6dULL, 0x86947fa8dff7a07eULL},
|
|
232
|
+
{0x9cc3a6eec6311a64ULL, 0x341ccfc98bfac44fULL},
|
|
233
|
+
{0xc3f490aa77bd60fdULL, 0x412403bbeef97563ULL},
|
|
234
|
+
{0xf4f1b4d515acb93cULL, 0x116d04aaeab7d2bbULL},
|
|
235
|
+
{0x991711052d8bf3c6ULL, 0x8ae422ead2b2e3b5ULL},
|
|
236
|
+
{0xbf5cd54678eef0b7ULL, 0x2d9d2ba5875f9ca2ULL},
|
|
237
|
+
{0xef340a98172aace5ULL, 0x7904768ee93783cbULL},
|
|
238
|
+
{0x9580869f0e7aac0fULL, 0x2ba2ca1951c2b25fULL},
|
|
239
|
+
{0xbae0a846d2195713ULL, 0x768b7c9fa6335ef6ULL},
|
|
240
|
+
{0xe998d258869facd8ULL, 0xd42e5bc78fc036b4ULL},
|
|
241
|
+
{0x91ff83775423cc07ULL, 0x849cf95cb9d82230ULL},
|
|
242
|
+
{0xb67f6455292cbf09ULL, 0xe5c437b3e84e2abdULL},
|
|
243
|
+
{0xe41f3d6a7377eecbULL, 0xdf3545a0e261b56cULL},
|
|
244
|
+
{0x8e938662882af53fULL, 0xab814b848d7d1163ULL},
|
|
245
|
+
{0xb23867fb2a35b28eULL, 0x16619e65b0dc55bcULL},
|
|
246
|
+
{0xdec681f9f4c31f32ULL, 0x9bfa05ff1d136b2bULL},
|
|
247
|
+
{0x8b3c113c38f9f37fULL, 0x217c43bf722c22fbULL},
|
|
248
|
+
{0xae0b158b4738705fULL, 0x69db54af4eb72bbaULL},
|
|
249
|
+
{0xd98ddaee19068c77ULL, 0xc45229db2264f6a8ULL},
|
|
250
|
+
{0x87f8a8d4cfa417caULL, 0x1ab35a28f57f1a29ULL},
|
|
251
|
+
{0xa9f6d30a038d1dbdULL, 0xa16030b332dee0b3ULL},
|
|
252
|
+
{0xd47487cc8470652cULL, 0x89b83cdfff9698e0ULL},
|
|
253
|
+
{0x84c8d4dfd2c63f3cULL, 0xd613260bffbe1f8cULL},
|
|
254
|
+
{0xa5fb0a17c777cf0aULL, 0x0b97ef8effada76fULL},
|
|
255
|
+
{0xcf79cc9db955c2cdULL, 0x8e7deb72bf99114bULL},
|
|
256
|
+
{0x81ac1fe293d599c0ULL, 0x390eb327b7bfaacfULL},
|
|
257
|
+
{0xa21727db38cb0030ULL, 0x47525ff1a5af9583ULL},
|
|
258
|
+
{0xca9cf1d206fdc03cULL, 0x5926f7ee0f1b7ae3ULL},
|
|
259
|
+
{0xfd442e4688bd304bULL, 0x6f70b5e992e2599cULL},
|
|
260
|
+
{0x9e4a9cec15763e2fULL, 0x65a671b1fbcd7801ULL},
|
|
261
|
+
{0xc5dd44271ad3cdbbULL, 0xbf100e1e7ac0d602ULL},
|
|
262
|
+
{0xf7549530e188c129ULL, 0x2ed411a619710b83ULL},
|
|
263
|
+
{0x9a94dd3e8cf578baULL, 0x7d448b07cfe6a731ULL},
|
|
264
|
+
{0xc13a148e3032d6e8ULL, 0x1c95adc9c3e050feULL},
|
|
265
|
+
{0xf18899b1bc3f8ca2ULL, 0x23bb193c34d8653eULL},
|
|
266
|
+
{0x96f5600f15a7b7e6ULL, 0xd654efc5a1073f46ULL},
|
|
267
|
+
{0xbcb2b812db11a5dfULL, 0x8bea2bb709490f18ULL},
|
|
268
|
+
{0xebdf661791d60f57ULL, 0xeee4b6a4cb9b52deULL},
|
|
269
|
+
{0x936b9fcebb25c996ULL, 0x354ef226ff4113cbULL},
|
|
270
|
+
{0xb84687c269ef3bfcULL, 0xc2a2aeb0bf1158bdULL},
|
|
271
|
+
{0xe65829b3046b0afbULL, 0xf34b5a5ceed5aeedULL},
|
|
272
|
+
{0x8ff71a0fe2c2e6ddULL, 0xb80f187a15458d54ULL},
|
|
273
|
+
{0xb3f4e093db73a094ULL, 0xa612de989a96f0a9ULL},
|
|
274
|
+
{0xe0f218b8d25088b9ULL, 0xcf97963ec13cacd3ULL},
|
|
275
|
+
{0x8c974f7383725574ULL, 0xe1bebde738c5ec04ULL},
|
|
276
|
+
{0xafbd2350644eead0ULL, 0x1a2e6d6106f76705ULL},
|
|
277
|
+
{0xdbac6c247d62a584ULL, 0x20ba08b948b540c6ULL},
|
|
278
|
+
{0x894bc396ce5da773ULL, 0x94744573cd71487cULL},
|
|
279
|
+
{0xab9eb47c81f51150ULL, 0xf99156d0c0cd9a9bULL},
|
|
280
|
+
{0xd686619ba27255a3ULL, 0x37f5ac84f1010142ULL},
|
|
281
|
+
{0x8613fd0145877586ULL, 0x42f98bd316a0a0c9ULL},
|
|
282
|
+
{0xa798fc4196e952e8ULL, 0xd3b7eec7dc48c8fbULL},
|
|
283
|
+
{0xd17f3b51fca3a7a1ULL, 0x08a5ea79d35afb3aULL},
|
|
284
|
+
{0x82ef85133de648c5ULL, 0x6567b28c2418dd04ULL},
|
|
285
|
+
{0xa3ab66580d5fdaf6ULL, 0x3ec19f2f2d1f1445ULL},
|
|
286
|
+
{0xcc963fee10b7d1b4ULL, 0xce7206faf866d957ULL},
|
|
287
|
+
{0xffbbcfe994e5c620ULL, 0x020e88b9b6808fadULL},
|
|
288
|
+
{0x9fd561f1fd0f9bd4ULL, 0x01491574121059ccULL},
|
|
289
|
+
{0xc7caba6e7c5382c9ULL, 0x019b5ad11694703fULL},
|
|
290
|
+
{0xf9bd690a1b68637cULL, 0xc20231855c398c4fULL},
|
|
291
|
+
{0x9c1661a651213e2eULL, 0xf9415ef359a3f7b1ULL},
|
|
292
|
+
{0xc31bfa0fe5698db9ULL, 0xb791b6b0300cf59dULL},
|
|
293
|
+
{0xf3e2f893dec3f127ULL, 0xa576245c3c103305ULL},
|
|
294
|
+
{0x986ddb5c6b3a76b8ULL, 0x0769d6b9a58a1fe3ULL},
|
|
295
|
+
{0xbe89523386091466ULL, 0x09444c680eeca7dcULL},
|
|
296
|
+
{0xee2ba6c0678b5980ULL, 0x8b955f8212a7d1d3ULL},
|
|
297
|
+
{0x94db483840b717f0ULL, 0x573d5bb14ba8e323ULL},
|
|
298
|
+
{0xba121a4650e4ddecULL, 0x6d0cb29d9e931becULL},
|
|
299
|
+
{0xe896a0d7e51e1567ULL, 0x884fdf450637e2e8ULL},
|
|
300
|
+
{0x915e2486ef32cd61ULL, 0xf531eb8b23e2edd1ULL},
|
|
301
|
+
{0xb5b5ada8aaff80b9ULL, 0xf27e666decdba945ULL},
|
|
302
|
+
{0xe3231912d5bf60e7ULL, 0xef1e000968129396ULL},
|
|
303
|
+
{0x8df5efabc5979c90ULL, 0x3572c005e10b9c3eULL},
|
|
304
|
+
{0xb1736b96b6fd83b4ULL, 0x42cf7007594e834dULL},
|
|
305
|
+
{0xddd0467c64bce4a1ULL, 0x53834c092fa22421ULL},
|
|
306
|
+
{0x8aa22c0dbef60ee5ULL, 0x94320f85bdc55694ULL},
|
|
307
|
+
{0xad4ab7112eb3929eULL, 0x793e93672d36ac39ULL},
|
|
308
|
+
{0xd89d64d57a607745ULL, 0x178e3840f8845748ULL},
|
|
309
|
+
{0x87625f056c7c4a8cULL, 0xeeb8e3289b52b68dULL},
|
|
310
|
+
{0xa93af6c6c79b5d2eULL, 0x2a671bf2c2276430ULL},
|
|
311
|
+
{0xd389b4787982347aULL, 0xb500e2ef72b13d3cULL},
|
|
312
|
+
{0x843610cb4bf160ccULL, 0x31208dd5a7aec645ULL},
|
|
313
|
+
{0xa54394fe1eedb8ffULL, 0x3d68b14b119a77d7ULL},
|
|
314
|
+
{0xce947a3da6a9273fULL, 0x8cc2dd9dd60115cdULL},
|
|
315
|
+
{0x811ccc668829b888ULL, 0xf7f9ca82a5c0ada0ULL},
|
|
316
|
+
{0xa163ff802a3426a9ULL, 0x35f83d234f30d908ULL},
|
|
317
|
+
{0xc9bcff6034c13053ULL, 0x03764c6c22fd0f4aULL},
|
|
318
|
+
{0xfc2c3f3841f17c68ULL, 0x4453df872bbc531dULL},
|
|
319
|
+
{0x9d9ba7832936edc1ULL, 0x2ab46bb47b55b3f2ULL},
|
|
320
|
+
{0xc5029163f384a932ULL, 0xf56186a19a2b20eeULL},
|
|
321
|
+
{0xf64335bcf065d37eULL, 0xb2b9e84a00b5e92aULL},
|
|
322
|
+
{0x99ea0196163fa42fULL, 0xafb4312e4071b1baULL},
|
|
323
|
+
{0xc06481fb9bcf8d3aULL, 0x1ba13d79d08e1e29ULL},
|
|
324
|
+
{0xf07da27a82c37089ULL, 0xa2898cd844b1a5b3ULL},
|
|
325
|
+
{0x964e858c91ba2656ULL, 0xc595f8072aef0790ULL},
|
|
326
|
+
{0xbbe226efb628afebULL, 0x76fb7608f5aac974ULL},
|
|
327
|
+
{0xeadab0aba3b2dbe6ULL, 0xd4ba538b33157bd1ULL},
|
|
328
|
+
{0x92c8ae6b464fc970ULL, 0xc4f47436ffed6d62ULL},
|
|
329
|
+
{0xb77ada0617e3bbccULL, 0xf6319144bfe8c8bbULL},
|
|
330
|
+
{0xe55990879ddcaabeULL, 0x33bdf595efe2faeaULL},
|
|
331
|
+
{0x8f57fa54c2a9eab7ULL, 0x6056b97db5eddcd2ULL},
|
|
332
|
+
{0xb32df8e9f3546565ULL, 0xb86c67dd23695406ULL},
|
|
333
|
+
{0xdff9772470297ebeULL, 0xa68781d46c43a908ULL},
|
|
334
|
+
{0x8bfbea76c619ef37ULL, 0xa814b124c3aa49a5ULL},
|
|
335
|
+
{0xaefae51477a06b04ULL, 0x1219dd6df494dc0eULL},
|
|
336
|
+
{0xdab99e59958885c5ULL, 0x16a054c971ba1312ULL},
|
|
337
|
+
{0x88b402f7fd75539cULL, 0xee2434fde7144bebULL},
|
|
338
|
+
{0xaae103b5fcd2a882ULL, 0x29ad423d60d95ee6ULL},
|
|
339
|
+
{0xd59944a37c0752a3ULL, 0xb41892ccb90fb6a0ULL},
|
|
340
|
+
{0x857fcae62d8493a6ULL, 0x908f5bbff3a9d224ULL},
|
|
341
|
+
{0xa6dfbd9fb8e5b88fULL, 0x34b332aff09446adULL},
|
|
342
|
+
{0xd097ad07a71f26b3ULL, 0x81dfff5becb95858ULL},
|
|
343
|
+
{0x825ecc24c8737830ULL, 0x712bff9973f3d737ULL},
|
|
344
|
+
{0xa2f67f2dfa90563cULL, 0x8d76ff7fd0f0cd05ULL},
|
|
345
|
+
{0xcbb41ef979346bcbULL, 0xb0d4bf5fc52d0046ULL},
|
|
346
|
+
{0xfea126b7d78186bdULL, 0x1d09ef37b6784057ULL},
|
|
347
|
+
{0x9f24b832e6b0f437ULL, 0xf2263582d20b2836ULL},
|
|
348
|
+
{0xc6ede63fa05d3144ULL, 0x6eafc2e3868df244ULL},
|
|
349
|
+
{0xf8a95fcf88747d95ULL, 0x8a5bb39c68316ed5ULL},
|
|
350
|
+
{0x9b69dbe1b548ce7dULL, 0x36795041c11ee545ULL},
|
|
351
|
+
{0xc24452da229b021cULL, 0x0417a45231669e97ULL},
|
|
352
|
+
{0xf2d56790ab41c2a3ULL, 0x051d8d66bdc0463cULL},
|
|
353
|
+
{0x97c560ba6b0919a6ULL, 0x2332786036982be5ULL},
|
|
354
|
+
{0xbdb6b8e905cb6010ULL, 0xabff1678443e36dfULL},
|
|
355
|
+
{0xed246723473e3814ULL, 0xd6fedc16554dc497ULL},
|
|
356
|
+
{0x9436c0760c86e30cULL, 0x065f498df5509adeULL},
|
|
357
|
+
{0xb94470938fa89bcfULL, 0x07f71bf172a4c196ULL},
|
|
358
|
+
{0xe7958cb87392c2c3ULL, 0x49f4e2edcf4df1fbULL},
|
|
359
|
+
{0x90bd77f3483bb9baULL, 0x4e390dd4a190b73dULL},
|
|
360
|
+
{0xb4ecd5f01a4aa829ULL, 0xe1c75149c9f4e50cULL},
|
|
361
|
+
{0xe2280b6c20dd5233ULL, 0xda39259c3c721e4fULL},
|
|
362
|
+
{0x8d590723948a5360ULL, 0xa863b781a5c752f1ULL},
|
|
363
|
+
{0xb0af48ec79ace838ULL, 0xd27ca5620f3927aeULL},
|
|
364
|
+
{0xdcdb1b2798182245ULL, 0x071bceba9307719aULL},
|
|
365
|
+
{0x8a08f0f8bf0f156cULL, 0xe47161349be4a700ULL},
|
|
366
|
+
{0xac8b2d36eed2dac6ULL, 0x1d8db981c2ddd0c0ULL},
|
|
367
|
+
{0xd7adf884aa879178ULL, 0xa4f127e2339544f0ULL},
|
|
368
|
+
{0x86ccbb52ea94baebULL, 0x6716b8ed603d4b16ULL},
|
|
369
|
+
{0xa87fea27a539e9a6ULL, 0xc0dc6728b84c9ddbULL},
|
|
370
|
+
{0xd29fe4b18e88640fULL, 0x711380f2e65fc552ULL},
|
|
371
|
+
{0x83a3eeeef9153e8aULL, 0xe6ac3097cffbdb53ULL},
|
|
372
|
+
{0xa48ceaaab75a8e2cULL, 0xa0573cbdc3fad228ULL},
|
|
373
|
+
{0xcdb02555653131b7ULL, 0xc86d0bed34f986b2ULL},
|
|
374
|
+
{0x808e17555f3ebf12ULL, 0x1d442774411bf42fULL},
|
|
375
|
+
{0xa0b19d2ab70e6ed7ULL, 0xa49531515162f13bULL},
|
|
376
|
+
{0xc8de047564d20a8cULL, 0x0dba7da5a5bbad8aULL},
|
|
377
|
+
{0xfb158592be068d2fULL, 0x11291d0f0f2a98edULL},
|
|
378
|
+
{0x9ced737bb6c4183eULL, 0xaab9b229697a9f94ULL},
|
|
379
|
+
{0xc428d05aa4751e4dULL, 0x55681eb3c3d94779ULL},
|
|
380
|
+
{0xf53304714d9265e0ULL, 0x2ac22660b4cf9957ULL},
|
|
381
|
+
{0x993fe2c6d07b7facULL, 0x1ab957fc7101bfd6ULL},
|
|
382
|
+
{0xbf8fdb78849a5f97ULL, 0x2167adfb8d422fccULL},
|
|
383
|
+
{0xef73d256a5c0f77dULL, 0x69c1997a7092bbbfULL},
|
|
384
|
+
{0x95a8637627989aaeULL, 0x2218ffec865bb557ULL},
|
|
385
|
+
{0xbb127c53b17ec15aULL, 0xaa9f3fe7a7f2a2adULL},
|
|
386
|
+
{0xe9d71b689dde71b0ULL, 0x55470fe191ef4b59ULL},
|
|
387
|
+
{0x9226712162ab070eULL, 0x354c69ecfb358f17ULL},
|
|
388
|
+
{0xb6b00d69bb55c8d2ULL, 0xc29f84683a02f2ddULL},
|
|
389
|
+
{0xe45c10c42a2b3b06ULL, 0x734765824883af95ULL},
|
|
390
|
+
{0x8eb98a7a9a5b04e4ULL, 0x880c9f716d524dbdULL},
|
|
391
|
+
{0xb267ed1940f1c61dULL, 0xaa0fc74dc8a6e12cULL},
|
|
392
|
+
{0xdf01e85f912e37a4ULL, 0x9493b9213ad09977ULL},
|
|
393
|
+
{0x8b61313bbabce2c7ULL, 0xdcdc53b4c4c25feaULL},
|
|
394
|
+
{0xae397d8aa96c1b78ULL, 0x541368a1f5f2f7e5ULL},
|
|
395
|
+
{0xd9c7dced53c72256ULL, 0x691842ca736fb5deULL},
|
|
396
|
+
{0x881cea14545c7576ULL, 0x81af29be8825d1abULL},
|
|
397
|
+
{0xaa242499697392d3ULL, 0x221af42e2a2f4616ULL},
|
|
398
|
+
{0xd4ad2dbfc3d07788ULL, 0x6aa1b139b4bb179bULL},
|
|
399
|
+
{0x84ec3c97da624ab5ULL, 0x42a50ec410f4eec1ULL},
|
|
400
|
+
{0xa6274bbdd0fadd62ULL, 0x134e527515322a71ULL},
|
|
401
|
+
{0xcfb11ead453994bbULL, 0x9821e7125a7eb50dULL},
|
|
402
|
+
{0x81ceb32c4b43fcf5ULL, 0x7f15306b788f3128ULL},
|
|
403
|
+
{0xa2425ff75e14fc32ULL, 0x5eda7c8656b2fd72ULL},
|
|
404
|
+
{0xcad2f7f5359a3b3fULL, 0xf6911ba7ec5fbccfULL},
|
|
405
|
+
{0xfd87b5f28300ca0eULL, 0x74356291e777ac03ULL},
|
|
406
|
+
{0x9e74d1b791e07e49ULL, 0x88a15d9b30aacb82ULL},
|
|
407
|
+
{0xc612062576589ddbULL, 0x6ac9b501fcd57e62ULL},
|
|
408
|
+
{0xf79687aed3eec552ULL, 0xc57c22427c0addfbULL},
|
|
409
|
+
{0x9abe14cd44753b53ULL, 0x3b6d95698d86cabdULL},
|
|
410
|
+
{0xc16d9a0095928a28ULL, 0x8a48fac3f0e87d6cULL},
|
|
411
|
+
{0xf1c90080baf72cb2ULL, 0xacdb3974ed229cc7ULL},
|
|
412
|
+
{0x971da05074da7befULL, 0x2c0903e91435a1fcULL},
|
|
413
|
+
{0xbce5086492111aebULL, 0x770b44e359430a7bULL},
|
|
414
|
+
{0xec1e4a7db69561a6ULL, 0xd4ce161c2f93cd1aULL},
|
|
415
|
+
{0x9392ee8e921d5d08ULL, 0xc500cdd19dbc6030ULL},
|
|
416
|
+
{0xb877aa3236a4b44aULL, 0xf6410146052b783dULL},
|
|
417
|
+
{0xe69594bec44de15cULL, 0xb3d141978676564cULL},
|
|
418
|
+
{0x901d7cf73ab0acdaULL, 0xf062c8feb409f5efULL},
|
|
419
|
+
{0xb424dc35095cd810ULL, 0xac7b7b3e610c736bULL},
|
|
420
|
+
{0xe12e13424bb40e14ULL, 0xd79a5a0df94f9046ULL},
|
|
421
|
+
{0x8cbccc096f5088ccULL, 0x06c07848bbd1ba2cULL},
|
|
422
|
+
{0xafebff0bcb24aaffULL, 0x0870965aeac628b7ULL},
|
|
423
|
+
{0xdbe6fecebdedd5bfULL, 0x4a8cbbf1a577b2e4ULL},
|
|
424
|
+
{0x89705f4136b4a598ULL, 0xce97f577076acfcfULL},
|
|
425
|
+
{0xabcc77118461cefdULL, 0x023df2d4c94583c2ULL},
|
|
426
|
+
{0xd6bf94d5e57a42bdULL, 0xc2cd6f89fb96e4b3ULL},
|
|
427
|
+
{0x8637bd05af6c69b6ULL, 0x59c065b63d3e4ef0ULL},
|
|
428
|
+
{0xa7c5ac471b478424ULL, 0xf0307f23cc8de2acULL},
|
|
429
|
+
{0xd1b71758e219652cULL, 0x2c3c9eecbfb15b57ULL},
|
|
430
|
+
{0x83126e978d4fdf3cULL, 0x9ba5e353f7ced916ULL},
|
|
431
|
+
{0xa3d70a3d70a3d70bULL, 0xc28f5c28f5c28f5cULL},
|
|
432
|
+
{0xcccccccccccccccdULL, 0x3333333333333333ULL},
|
|
433
|
+
{0x8000000000000000ULL, 0x0000000000000000ULL},
|
|
434
|
+
{0xa000000000000000ULL, 0x0000000000000000ULL},
|
|
435
|
+
{0xc800000000000000ULL, 0x0000000000000000ULL},
|
|
436
|
+
{0xfa00000000000000ULL, 0x0000000000000000ULL},
|
|
437
|
+
{0x9c40000000000000ULL, 0x0000000000000000ULL},
|
|
438
|
+
{0xc350000000000000ULL, 0x0000000000000000ULL},
|
|
439
|
+
{0xf424000000000000ULL, 0x0000000000000000ULL},
|
|
440
|
+
{0x9896800000000000ULL, 0x0000000000000000ULL},
|
|
441
|
+
{0xbebc200000000000ULL, 0x0000000000000000ULL},
|
|
442
|
+
{0xee6b280000000000ULL, 0x0000000000000000ULL},
|
|
443
|
+
{0x9502f90000000000ULL, 0x0000000000000000ULL},
|
|
444
|
+
{0xba43b74000000000ULL, 0x0000000000000000ULL},
|
|
445
|
+
{0xe8d4a51000000000ULL, 0x0000000000000000ULL},
|
|
446
|
+
{0x9184e72a00000000ULL, 0x0000000000000000ULL},
|
|
447
|
+
{0xb5e620f480000000ULL, 0x0000000000000000ULL},
|
|
448
|
+
{0xe35fa931a0000000ULL, 0x0000000000000000ULL},
|
|
449
|
+
{0x8e1bc9bf04000000ULL, 0x0000000000000000ULL},
|
|
450
|
+
{0xb1a2bc2ec5000000ULL, 0x0000000000000000ULL},
|
|
451
|
+
{0xde0b6b3a76400000ULL, 0x0000000000000000ULL},
|
|
452
|
+
{0x8ac7230489e80000ULL, 0x0000000000000000ULL},
|
|
453
|
+
{0xad78ebc5ac620000ULL, 0x0000000000000000ULL},
|
|
454
|
+
{0xd8d726b7177a8000ULL, 0x0000000000000000ULL},
|
|
455
|
+
{0x878678326eac9000ULL, 0x0000000000000000ULL},
|
|
456
|
+
{0xa968163f0a57b400ULL, 0x0000000000000000ULL},
|
|
457
|
+
{0xd3c21bcecceda100ULL, 0x0000000000000000ULL},
|
|
458
|
+
{0x84595161401484a0ULL, 0x0000000000000000ULL},
|
|
459
|
+
{0xa56fa5b99019a5c8ULL, 0x0000000000000000ULL},
|
|
460
|
+
{0xcecb8f27f4200f3aULL, 0x0000000000000000ULL},
|
|
461
|
+
{0x813f3978f8940985ULL, 0xc000000000000000ULL},
|
|
462
|
+
{0xa18f07d736b90be6ULL, 0xb000000000000000ULL},
|
|
463
|
+
{0xc9f2c9cd04674edfULL, 0x5c00000000000000ULL},
|
|
464
|
+
{0xfc6f7c4045812297ULL, 0xb300000000000000ULL},
|
|
465
|
+
{0x9dc5ada82b70b59eULL, 0x0fe0000000000000ULL},
|
|
466
|
+
{0xc5371912364ce306ULL, 0x93d8000000000000ULL},
|
|
467
|
+
{0xf684df56c3e01bc7ULL, 0x38ce000000000000ULL},
|
|
468
|
+
{0x9a130b963a6c115dULL, 0xc380c00000000000ULL},
|
|
469
|
+
{0xc097ce7bc90715b4ULL, 0xb460f00000000000ULL},
|
|
470
|
+
{0xf0bdc21abb48db21ULL, 0xe1792c0000000000ULL},
|
|
471
|
+
{0x96769950b50d88f5ULL, 0xecebbb8000000000ULL},
|
|
472
|
+
{0xbc143fa4e250eb32ULL, 0xe826aa6000000000ULL},
|
|
473
|
+
{0xeb194f8e1ae525feULL, 0xa23054f800000000ULL},
|
|
474
|
+
{0x92efd1b8d0cf37bfULL, 0xa55e351b00000000ULL},
|
|
475
|
+
{0xb7abc627050305aeULL, 0x0eb5c261c0000000ULL},
|
|
476
|
+
{0xe596b7b0c643c71aULL, 0x926332fa30000000ULL},
|
|
477
|
+
{0x8f7e32ce7bea5c70ULL, 0x1b7dffdc5e000000ULL},
|
|
478
|
+
{0xb35dbf821ae4f38cULL, 0x225d7fd375800000ULL},
|
|
479
|
+
{0xe0352f62a19e306fULL, 0x2af4dfc852e00000ULL},
|
|
480
|
+
{0x8c213d9da502de46ULL, 0xbad90bdd33cc0000ULL},
|
|
481
|
+
{0xaf298d050e4395d7ULL, 0x698f4ed480bf0000ULL},
|
|
482
|
+
{0xdaf3f04651d47b4dULL, 0xc3f32289a0eec000ULL},
|
|
483
|
+
{0x88d8762bf324cd10ULL, 0x5a77f59604953800ULL},
|
|
484
|
+
{0xab0e93b6efee0054ULL, 0x7115f2fb85ba8600ULL},
|
|
485
|
+
{0xd5d238a4abe98069ULL, 0x8d5b6fba67292780ULL},
|
|
486
|
+
{0x85a36366eb71f042ULL, 0xb85925d48079b8b0ULL},
|
|
487
|
+
{0xa70c3c40a64e6c52ULL, 0x666f6f49a09826dcULL},
|
|
488
|
+
{0xd0cf4b50cfe20766ULL, 0x000b4b1c08be3093ULL},
|
|
489
|
+
{0x82818f1281ed44a0ULL, 0x40070ef18576de5bULL},
|
|
490
|
+
{0xa321f2d7226895c8ULL, 0x5008d2ade6d495f2ULL},
|
|
491
|
+
{0xcbea6f8ceb02bb3aULL, 0x640b07596089bb6fULL},
|
|
492
|
+
{0xfee50b7025c36a09ULL, 0xfd0dc92fb8ac2a4bULL},
|
|
493
|
+
{0x9f4f2726179a2246ULL, 0xfe289dbdd36b9a6fULL},
|
|
494
|
+
{0xc722f0ef9d80aad7ULL, 0xbdb2c52d4846810aULL},
|
|
495
|
+
{0xf8ebad2b84e0d58cULL, 0x2d1f76789a58214dULL},
|
|
496
|
+
{0x9b934c3b330c8578ULL, 0x9c33aa0b607714d0ULL},
|
|
497
|
+
{0xc2781f49ffcfa6d6ULL, 0xc340948e3894da04ULL},
|
|
498
|
+
{0xf316271c7fc3908bULL, 0x7410b9b1c6ba1085ULL},
|
|
499
|
+
{0x97edd871cfda3a57ULL, 0x688a740f1c344a53ULL},
|
|
500
|
+
{0xbde94e8e43d0c8edULL, 0xc2ad1112e3415ce8ULL},
|
|
501
|
+
{0xed63a231d4c4fb28ULL, 0xb35855579c11b422ULL},
|
|
502
|
+
{0x945e455f24fb1cf9ULL, 0x70173556c18b1095ULL},
|
|
503
|
+
{0xb975d6b6ee39e437ULL, 0x4c1d02ac71edd4bbULL},
|
|
504
|
+
{0xe7d34c64a9c85d45ULL, 0x9f2443578e6949e9ULL},
|
|
505
|
+
{0x90e40fbeea1d3a4bULL, 0x4376aa16b901ce32ULL},
|
|
506
|
+
{0xb51d13aea4a488deULL, 0x9454549c674241beULL},
|
|
507
|
+
{0xe264589a4dcdab15ULL, 0x396969c38112d22eULL},
|
|
508
|
+
{0x8d7eb76070a08aedULL, 0x03e1e21a30abc35dULL},
|
|
509
|
+
{0xb0de65388cc8ada9ULL, 0xc4da5aa0bcd6b434ULL},
|
|
510
|
+
{0xdd15fe86affad913ULL, 0xb610f148ec0c6141ULL},
|
|
511
|
+
{0x8a2dbf142dfcc7acULL, 0x91ca96cd9387bcc8ULL},
|
|
512
|
+
{0xacb92ed9397bf997ULL, 0xb63d3c80f869abfbULL},
|
|
513
|
+
{0xd7e77a8f87daf7fcULL, 0x23cc8ba1368416f9ULL},
|
|
514
|
+
{0x86f0ac99b4e8dafeULL, 0x965fd744c2128e5cULL},
|
|
515
|
+
{0xa8acd7c0222311bdULL, 0x3bf7cd15f29731f3ULL},
|
|
516
|
+
{0xd2d80db02aabd62cULL, 0x0af5c05b6f3cfe6fULL},
|
|
517
|
+
{0x83c7088e1aab65dcULL, 0x86d9983925861f05ULL},
|
|
518
|
+
{0xa4b8cab1a1563f53ULL, 0xa88ffe476ee7a6c7ULL},
|
|
519
|
+
{0xcde6fd5e09abcf27ULL, 0x12b3fdd94aa19079ULL},
|
|
520
|
+
{0x80b05e5ac60b6179ULL, 0xabb07ea7cea4fa4bULL},
|
|
521
|
+
{0xa0dc75f1778e39d7ULL, 0x969c9e51c24e38deULL},
|
|
522
|
+
{0xc913936dd571c84dULL, 0xfc43c5e632e1c716ULL},
|
|
523
|
+
{0xfb5878494ace3a60ULL, 0xfb54b75fbf9a38dcULL},
|
|
524
|
+
{0x9d174b2dcec0e47cULL, 0x9d14f29bd7c06389ULL},
|
|
525
|
+
{0xc45d1df942711d9bULL, 0xc45a2f42cdb07c6bULL},
|
|
526
|
+
{0xf5746577930d6501ULL, 0x3570bb13811c9b86ULL},
|
|
527
|
+
{0x9968bf6abbe85f21ULL, 0x816674ec30b1e134ULL},
|
|
528
|
+
{0xbfc2ef456ae276e9ULL, 0x61c012273cde5981ULL},
|
|
529
|
+
{0xefb3ab16c59b14a3ULL, 0x3a3016b10c15efe1ULL},
|
|
530
|
+
{0x95d04aee3b80ece6ULL, 0x445e0e2ea78db5edULL},
|
|
531
|
+
{0xbb445da9ca612820ULL, 0xd57591ba51712368ULL},
|
|
532
|
+
{0xea1575143cf97227ULL, 0x0ad2f628e5cd6c42ULL},
|
|
533
|
+
{0x924d692ca61be759ULL, 0xa6c3d9d98fa063a9ULL},
|
|
534
|
+
{0xb6e0c377cfa2e12fULL, 0x9074d04ff3887c93ULL},
|
|
535
|
+
{0xe498f455c38b997bULL, 0xf4920463f06a9bb8ULL},
|
|
536
|
+
{0x8edf98b59a373fedULL, 0xb8db42be7642a153ULL},
|
|
537
|
+
{0xb2977ee300c50fe8ULL, 0xa712136e13d349a8ULL},
|
|
538
|
+
{0xdf3d5e9bc0f653e2ULL, 0xd0d6984998c81c12ULL},
|
|
539
|
+
{0x8b865b215899f46dULL, 0x42861f2dff7d118bULL},
|
|
540
|
+
{0xae67f1e9aec07188ULL, 0x1327a6f97f5c55eeULL},
|
|
541
|
+
{0xda01ee641a708deaULL, 0x17f190b7df336b6aULL},
|
|
542
|
+
{0x884134fe908658b3ULL, 0xcef6fa72eb802322ULL},
|
|
543
|
+
{0xaa51823e34a7eedfULL, 0x42b4b90fa6602beaULL},
|
|
544
|
+
{0xd4e5e2cdc1d1ea97ULL, 0x9361e7538ff836e5ULL},
|
|
545
|
+
{0x850fadc09923329fULL, 0xfc1d309439fb224fULL},
|
|
546
|
+
{0xa6539930bf6bff46ULL, 0x7b247cb94879eae3ULL},
|
|
547
|
+
{0xcfe87f7cef46ff17ULL, 0x19ed9be79a98659cULL},
|
|
548
|
+
{0x81f14fae158c5f6fULL, 0xb0348170c09f3f81ULL},
|
|
549
|
+
{0xa26da3999aef774aULL, 0x1c41a1ccf0c70f62ULL},
|
|
550
|
+
{0xcb090c8001ab551dULL, 0xa3520a402cf8d33aULL},
|
|
551
|
+
{0xfdcb4fa002162a64ULL, 0x8c268cd038370809ULL},
|
|
552
|
+
{0x9e9f11c4014dda7fULL, 0xd798180223226505ULL},
|
|
553
|
+
{0xc646d63501a1511eULL, 0x4d7e1e02abeafe47ULL},
|
|
554
|
+
{0xf7d88bc24209a566ULL, 0xe0dda58356e5bdd9ULL},
|
|
555
|
+
{0x9ae7575969460760ULL, 0xcc8a8772164f96a7ULL},
|
|
556
|
+
{0xc1a12d2fc3978938ULL, 0xffad294e9be37c51ULL},
|
|
557
|
+
{0xf209787bb47d6b85ULL, 0x3f9873a242dc5b65ULL},
|
|
558
|
+
{0x9745eb4d50ce6333ULL, 0x07bf484569c9b91fULL},
|
|
559
|
+
{0xbd176620a501fc00ULL, 0x49af1a56c43c2767ULL},
|
|
560
|
+
{0xec5d3fa8ce427b00ULL, 0x5c1ae0ec754b3141ULL},
|
|
561
|
+
{0x93ba47c980e98ce0ULL, 0x3990cc93c94efec8ULL},
|
|
562
|
+
{0xb8a8d9bbe123f018ULL, 0x47f4ffb8bba2be7bULL},
|
|
563
|
+
{0xe6d3102ad96cec1eULL, 0x59f23fa6ea8b6e1aULL},
|
|
564
|
+
{0x9043ea1ac7e41393ULL, 0x783767c8529724d0ULL},
|
|
565
|
+
{0xb454e4a179dd1878ULL, 0xd64541ba673cee04ULL},
|
|
566
|
+
{0xe16a1dc9d8545e95ULL, 0x0bd69229010c2985ULL},
|
|
567
|
+
{0x8ce2529e2734bb1eULL, 0xe7661b59a0a799f3ULL},
|
|
568
|
+
{0xb01ae745b101e9e5ULL, 0xa13fa23008d18070ULL},
|
|
569
|
+
{0xdc21a1171d42645eULL, 0x898f8abc0b05e08cULL},
|
|
570
|
+
{0x899504ae72497ebbULL, 0x95f9b6b586e3ac57ULL},
|
|
571
|
+
{0xabfa45da0edbde6aULL, 0xfb782462e89c976dULL},
|
|
572
|
+
{0xd6f8d7509292d604ULL, 0xba562d7ba2c3bd49ULL},
|
|
573
|
+
{0x865b86925b9bc5c3ULL, 0xf475dc6d45ba564dULL},
|
|
574
|
+
{0xa7f26836f282b733ULL, 0x719353889728ebe1ULL},
|
|
575
|
+
{0xd1ef0244af236500ULL, 0xcdf8286abcf326d9ULL},
|
|
576
|
+
{0x8335616aed761f20ULL, 0x80bb1942b617f847ULL},
|
|
577
|
+
{0xa402b9c5a8d3a6e8ULL, 0xa0e9df93639df659ULL},
|
|
578
|
+
{0xcd036837130890a2ULL, 0xc92457783c8573f0ULL},
|
|
579
|
+
{0x802221226be55a65ULL, 0x3db6b6ab25d36876ULL},
|
|
580
|
+
{0xa02aa96b06deb0feULL, 0x0d246455ef484293ULL},
|
|
581
|
+
{0xc83553c5c8965d3eULL, 0x906d7d6b6b1a5338ULL},
|
|
582
|
+
{0xfa42a8b73abbf48dULL, 0x3488dcc645e0e806ULL},
|
|
583
|
+
{0x9c69a97284b578d8ULL, 0x00d589fbebac9104ULL},
|
|
584
|
+
{0xc38413cf25e2d70eULL, 0x010aec7ae697b545ULL},
|
|
585
|
+
{0xf46518c2ef5b8cd2ULL, 0x814da799a03da296ULL},
|
|
586
|
+
{0x98bf2f79d5993803ULL, 0x10d088c00426859eULL},
|
|
587
|
+
{0xbeeefb584aff8604ULL, 0x5504aaf005302705ULL},
|
|
588
|
+
{0xeeaaba2e5dbf6785ULL, 0x6a45d5ac067c30c7ULL},
|
|
589
|
+
{0x952ab45cfa97a0b3ULL, 0x226ba58b840d9e7cULL},
|
|
590
|
+
{0xba756174393d88e0ULL, 0x6b068eee6511061bULL},
|
|
591
|
+
{0xe912b9d1478ceb18ULL, 0x85c832a9fe5547a2ULL},
|
|
592
|
+
{0x91abb422ccb812efULL, 0x539d1faa3ef54cc5ULL},
|
|
593
|
+
{0xb616a12b7fe617abULL, 0xa8846794ceb29ff6ULL},
|
|
594
|
+
{0xe39c49765fdf9d95ULL, 0x12a5817a025f47f4ULL},
|
|
595
|
+
{0x8e41ade9fbebc27eULL, 0xeba770ec417b8cf8ULL},
|
|
596
|
+
{0xb1d219647ae6b31dULL, 0xa6914d2751da7037ULL},
|
|
597
|
+
{0xde469fbd99a05fe4ULL, 0x9035a07126510c44ULL},
|
|
598
|
+
{0x8aec23d680043befULL, 0xda218446b7f2a7abULL},
|
|
599
|
+
{0xada72ccc20054aeaULL, 0x50a9e55865ef5195ULL},
|
|
600
|
+
{0xd910f7ff28069da5ULL, 0xe4d45eae7f6b25fbULL},
|
|
601
|
+
{0x87aa9aff79042287ULL, 0x6f04bb2d0fa2f7bdULL},
|
|
602
|
+
{0xa99541bf57452b29ULL, 0xcac5e9f8538bb5acULL},
|
|
603
|
+
{0xd3fa922f2d1675f3ULL, 0xbd776476686ea317ULL},
|
|
604
|
+
{0x847c9b5d7c2e09b8ULL, 0x966a9eca014525eeULL},
|
|
605
|
+
{0xa59bc234db398c26ULL, 0xbc05467c81966f6aULL},
|
|
606
|
+
{0xcf02b2c21207ef2fULL, 0x6b06981ba1fc0b44ULL},
|
|
607
|
+
{0x8161afb94b44f57eULL, 0xe2e41f11453d870aULL},
|
|
608
|
+
{0xa1ba1ba79e1632ddULL, 0x9b9d26d5968ce8cdULL},
|
|
609
|
+
{0xca28a291859bbf94ULL, 0x8284708afc302301ULL},
|
|
610
|
+
{0xfcb2cb35e702af79ULL, 0xa3258cadbb3c2bc1ULL},
|
|
611
|
+
{0x9defbf01b061adacULL, 0xc5f777ec95059b58ULL},
|
|
612
|
+
{0xc56baec21c7a1917ULL, 0xf77555e7ba47022fULL},
|
|
613
|
+
{0xf6c69a72a3989f5cULL, 0x7552ab61a8d8c2baULL},
|
|
614
|
+
{0x9a3c2087a63f639aULL, 0xc953ab1d098779b4ULL},
|
|
615
|
+
{0xc0cb28a98fcf3c80ULL, 0x7ba895e44be95822ULL},
|
|
616
|
+
{0xf0fdf2d3f3c30ba0ULL, 0x9a92bb5d5ee3ae2aULL},
|
|
617
|
+
{0x969eb7c47859e744ULL, 0x609bb51a5b4e4cdaULL},
|
|
618
|
+
{0xbc4665b596706115ULL, 0x78c2a260f221e011ULL},
|
|
619
|
+
{0xeb57ff22fc0c795aULL, 0x56f34af92eaa5815ULL},
|
|
620
|
+
{0x9316ff75dd87cbd9ULL, 0xf6580edbbd2a770dULL},
|
|
621
|
+
{0xb7dcbf5354e9becfULL, 0xf3ee1292ac7514d0ULL},
|
|
622
|
+
{0xe5d3ef282a242e82ULL, 0x70e9973757925a05ULL},
|
|
623
|
+
{0x8fa475791a569d11ULL, 0x0691fe8296bb7843ULL},
|
|
624
|
+
{0xb38d92d760ec4456ULL, 0xc8367e233c6a5653ULL},
|
|
625
|
+
{0xe070f78d3927556bULL, 0x7a441dac0b84ebe8ULL},
|
|
626
|
+
{0x8c469ab843b89563ULL, 0x6c6a928b87331371ULL},
|
|
627
|
+
{0xaf58416654a6babcULL, 0xc785372e68ffd84dULL},
|
|
628
|
+
{0xdb2e51bfe9d0696bULL, 0xf96684fa033fce61ULL},
|
|
629
|
+
{0x88fcf317f22241e3ULL, 0xbbe0131c4207e0fcULL},
|
|
630
|
+
{0xab3c2fddeeaad25bULL, 0x2ad817e35289d93cULL},
|
|
631
|
+
{0xd60b3bd56a5586f2ULL, 0x758e1ddc272c4f8bULL},
|
|
632
|
+
{0x85c7056562757457ULL, 0x0978d2a9987bb1b6ULL},
|
|
633
|
+
{0xa738c6bebb12d16dULL, 0x4bd70753fe9a9e24ULL},
|
|
634
|
+
{0xd106f86e69d785c8ULL, 0x1eccc928fe4145adULL},
|
|
635
|
+
{0x82a45b450226b39dULL, 0x133ffdb99ee8cb8cULL},
|
|
636
|
+
{0xa34d721642b06085ULL, 0xd80ffd2806a2fe6fULL},
|
|
637
|
+
{0xcc20ce9bd35c78a6ULL, 0xce13fc72084bbe0bULL},
|
|
638
|
+
{0xff290242c83396cfULL, 0x8198fb8e8a5ead8eULL},
|
|
639
|
+
{0x9f79a169bd203e42ULL, 0xf0ff9d39167b2c79ULL},
|
|
640
|
+
{0xc75809c42c684dd2ULL, 0xad3f84875c19f797ULL},
|
|
641
|
+
{0xf92e0c3537826146ULL, 0x588f65a93320757dULL},
|
|
642
|
+
{0x9bbcc7a142b17cccULL, 0x77599f89bff4496eULL},
|
|
643
|
+
{0xc2abf989935ddbffULL, 0x9530076c2ff15bcaULL},
|
|
644
|
+
{0xf356f7ebf83552ffULL, 0xfa7c09473bedb2bcULL},
|
|
645
|
+
{0x98165af37b2153dfULL, 0x3c8d85cc85748fb5ULL},
|
|
646
|
+
{0xbe1bf1b059e9a8d7ULL, 0x8bb0e73fa6d1b3a3ULL},
|
|
647
|
+
{0xeda2ee1c7064130dULL, 0xee9d210f9086208cULL},
|
|
648
|
+
{0x9485d4d1c63e8be8ULL, 0x752234a9ba53d457ULL},
|
|
649
|
+
{0xb9a74a0637ce2ee2ULL, 0x926ac1d428e8c96dULL},
|
|
650
|
+
{0xe8111c87c5c1ba9aULL, 0x370572493322fbc8ULL},
|
|
651
|
+
{0x910ab1d4db9914a1ULL, 0xe263676dbff5dd5dULL},
|
|
652
|
+
{0xb54d5e4a127f59c9ULL, 0xdafc41492ff354b4ULL},
|
|
653
|
+
{0xe2a0b5dc971f303bULL, 0xd1bb519b7bf029e2ULL},
|
|
654
|
+
{0x8da471a9de737e25ULL, 0xa31513012d761a2dULL},
|
|
655
|
+
{0xb10d8e1456105daeULL, 0x8bda57c178d3a0b8ULL},
|
|
656
|
+
{0xdd50f1996b947519ULL, 0x2ed0edb1d70888e6ULL},
|
|
657
|
+
{0x8a5296ffe33cc930ULL, 0x7d42948f26655590ULL},
|
|
658
|
+
{0xace73cbfdc0bfb7cULL, 0x9c9339b2effeaaf4ULL},
|
|
659
|
+
{0xd8210befd30efa5bULL, 0xc3b8081fabfe55b1ULL},
|
|
660
|
+
{0x8714a775e3e95c79ULL, 0x9a530513cb7ef58eULL},
|
|
661
|
+
{0xa8d9d1535ce3b397ULL, 0x80e7c658be5eb2f2ULL},
|
|
662
|
+
{0xd31045a8341ca07dULL, 0xe121b7eeedf65fafULL},
|
|
663
|
+
{0x83ea2b892091e44eULL, 0x6cb512f554b9fbcdULL},
|
|
664
|
+
{0xa4e4b66b68b65d61ULL, 0x07e257b2a9e87ac0ULL},
|
|
665
|
+
{0xce1de40642e3f4baULL, 0xc9daed9f54629971ULL},
|
|
666
|
+
{0x80d2ae83e9ce78f4ULL, 0x3e28d48394bd9fe6ULL},
|
|
667
|
+
{0xa1075a24e4421731ULL, 0x4db309a479ed07e0ULL},
|
|
668
|
+
{0xc94930ae1d529cfdULL, 0x211fcc0d986849d8ULL},
|
|
669
|
+
{0xfb9b7cd9a4a7443dULL, 0xe967bf10fe825c4eULL},
|
|
670
|
+
{0x9d412e0806e88aa6ULL, 0x71e0d76a9f1179b1ULL},
|
|
671
|
+
{0xc491798a08a2ad4fULL, 0x0e590d4546d5d81dULL},
|
|
672
|
+
{0xf5b5d7ec8acb58a3ULL, 0x51ef5096988b4e24ULL},
|
|
673
|
+
{0x9991a6f3d6bf1766ULL, 0x5335925e1f5710d6ULL},
|
|
674
|
+
{0xbff610b0cc6edd40ULL, 0xe802f6f5a72cd50cULL},
|
|
675
|
+
{0xeff394dcff8a948fULL, 0x2203b4b310f80a4fULL},
|
|
676
|
+
{0x95f83d0a1fb69cdaULL, 0xb54250efea9b0671ULL},
|
|
677
|
+
{0xbb764c4ca7a44410ULL, 0x6292e52be541c80eULL},
|
|
678
|
+
{0xea53df5fd18d5514ULL, 0x7b379e76de923a12ULL},
|
|
679
|
+
{0x92746b9be2f8552dULL, 0xcd02c30a4b1b644bULL},
|
|
680
|
+
{0xb7118682dbb66a78ULL, 0xc04373ccdde23d5eULL},
|
|
681
|
+
{0xe4d5e82392a40516ULL, 0xf05450c0155accb5ULL},
|
|
682
|
+
{0x8f05b1163ba6832eULL, 0xd634b2780d58bff1ULL},
|
|
683
|
+
{0xb2c71d5bca9023f9ULL, 0x8bc1df1610aeefedULL},
|
|
684
|
+
{0xdf78e4b2bd342cf7ULL, 0x6eb256db94daabe9ULL},
|
|
685
|
+
{0x8bab8eefb6409c1bULL, 0xe52f76493d08ab71ULL},
|
|
686
|
+
{0xae9672aba3d0c321ULL, 0x5e7b53db8c4ad64eULL},
|
|
687
|
+
{0xda3c0f568cc4f3e9ULL, 0x361a28d26f5d8be1ULL},
|
|
688
|
+
{0x8865899617fb1872ULL, 0x81d05983859a776dULL},
|
|
689
|
+
{0xaa7eebfb9df9de8eULL, 0x22446fe467011548ULL},
|
|
690
|
+
{0xd51ea6fa85785632ULL, 0xaad58bdd80c15a9aULL},
|
|
691
|
+
{0x8533285c936b35dfULL, 0x2ac5776a7078d8a0ULL},
|
|
692
|
+
{0xa67ff273b8460357ULL, 0x7576d5450c970ec8ULL},
|
|
693
|
+
{0xd01fef10a657842dULL, 0xd2d48a964fbcd27aULL},
|
|
694
|
+
{0x8213f56a67f6b29cULL, 0x63c4d69df1d6038cULL},
|
|
695
|
+
{0xa298f2c501f45f43ULL, 0x7cb60c456e4b8470ULL},
|
|
696
|
+
{0xcb3f2f7642717714ULL, 0xdbe38f56c9de658cULL},
|
|
697
|
+
{0xfe0efb53d30dd4d8ULL, 0x12dc732c7c55feefULL},
|
|
698
|
+
{0x9ec95d1463e8a507ULL, 0x0bc9c7fbcdb5bf55ULL},
|
|
699
|
+
{0xc67bb4597ce2ce49ULL, 0x4ebc39fac1232f2aULL},
|
|
700
|
+
{0xf81aa16fdc1b81dbULL, 0x226b4879716bfaf5ULL},
|
|
701
|
+
{0x9b10a4e5e9913129ULL, 0x35830d4be6e37cd9ULL},
|
|
702
|
+
{0xc1d4ce1f63f57d73ULL, 0x02e3d09ee09c5c0fULL},
|
|
703
|
+
{0xf24a01a73cf2dcd0ULL, 0x439cc4c698c37313ULL},
|
|
704
|
+
{0x976e41088617ca02ULL, 0x2a41fafc1f7a27ecULL},
|
|
705
|
+
{0xbd49d14aa79dbc83ULL, 0xb4d279bb2758b1e7ULL},
|
|
706
|
+
{0xec9c459d51852ba3ULL, 0x22071829f12ede61ULL},
|
|
707
|
+
{0x93e1ab8252f33b46ULL, 0x35446f1a36bd4afcULL},
|
|
708
|
+
{0xb8da1662e7b00a18ULL, 0xc2958ae0c46c9dbcULL},
|
|
709
|
+
{0xe7109bfba19c0c9eULL, 0xf33aed98f587c52bULL},
|
|
710
|
+
{0x906a617d450187e3ULL, 0xd804d47f9974db3aULL},
|
|
711
|
+
{0xb484f9dc9641e9dbULL, 0x4e06099f7fd21209ULL},
|
|
712
|
+
{0xe1a63853bbd26452ULL, 0xa1878c075fc6968cULL},
|
|
713
|
+
{0x8d07e33455637eb3ULL, 0x24f4b7849bdc1e17ULL},
|
|
714
|
+
{0xb049dc016abc5e60ULL, 0x6e31e565c2d3259dULL},
|
|
715
|
+
{0xdc5c5301c56b75f8ULL, 0x89be5ebf3387ef04ULL},
|
|
716
|
+
{0x89b9b3e11b6329bbULL, 0x5616fb378034f562ULL},
|
|
717
|
+
{0xac2820d9623bf42aULL, 0xab9cba05604232bbULL},
|
|
718
|
+
{0xd732290fbacaf134ULL, 0x5683e886b852bf6aULL},
|
|
719
|
+
{0x867f59a9d4bed6c1ULL, 0xb61271543333b7a2ULL},
|
|
720
|
+
{0xa81f301449ee8c71ULL, 0xa3970da94000a58bULL},
|
|
721
|
+
{0xd226fc195c6a2f8dULL, 0x8c7cd1139000ceeeULL},
|
|
722
|
+
{0x83585d8fd9c25db8ULL, 0x37ce02ac3a008154ULL},
|
|
723
|
+
{0xa42e74f3d032f526ULL, 0x45c183574880a1aaULL},
|
|
724
|
+
{0xcd3a1230c43fb270ULL, 0xd731e42d1aa0ca14ULL},
|
|
725
|
+
{0x80444b5e7aa7cf86ULL, 0x867f2e9c30a47e4cULL},
|
|
726
|
+
{0xa0555e361951c367ULL, 0x281efa433ccd9de0ULL},
|
|
727
|
+
{0xc86ab5c39fa63441ULL, 0x7226b8d40c010558ULL},
|
|
728
|
+
{0xfa856334878fc151ULL, 0x4eb067090f0146aeULL},
|
|
729
|
+
{0x9c935e00d4b9d8d3ULL, 0x912e4065a960cc2cULL},
|
|
730
|
+
{0xc3b8358109e84f08ULL, 0xf579d07f13b8ff37ULL},
|
|
731
|
+
{0xf4a642e14c6262c9ULL, 0x32d8449ed8a73f05ULL},
|
|
732
|
+
{0x98e7e9cccfbd7dbeULL, 0x7fc72ae347688763ULL},
|
|
733
|
+
{0xbf21e44003acdd2dULL, 0x1fb8f59c1942a93cULL},
|
|
734
|
+
{0xeeea5d5004981479ULL, 0xe7a733031f93538bULL},
|
|
735
|
+
{0x95527a5202df0cccULL, 0xf0c87fe1f3bc1437ULL},
|
|
736
|
+
{0xbaa718e68396cffeULL, 0x2cfa9fda70ab1945ULL},
|
|
737
|
+
{0xe950df20247c83feULL, 0xb83947d10cd5df96ULL},
|
|
738
|
+
{0x91d28b7416cdd27fULL, 0xb323cce2a805abbeULL},
|
|
739
|
+
{0xb6472e511c81471eULL, 0x1fecc01b520716adULL},
|
|
740
|
+
{0xe3d8f9e563a198e6ULL, 0xa7e7f0222688dc59ULL},
|
|
741
|
+
{0x8e679c2f5e44ff90ULL, 0xa8f0f615581589b7ULL},
|
|
742
|
+
{0xb201833b35d63f74ULL, 0xd32d339aae1aec25ULL},
|
|
743
|
+
{0xde81e40a034bcf50ULL, 0x07f8808159a1a72eULL},
|
|
744
|
+
{0x8b112e86420f6192ULL, 0x04fb5050d805087dULL},
|
|
745
|
+
{0xadd57a27d29339f7ULL, 0x863a24650e064a9cULL},
|
|
746
|
+
{0xd94ad8b1c7380875ULL, 0xe7c8ad7e5187dd43ULL},
|
|
747
|
+
{0x87cec76f1c830549ULL, 0x70dd6c6ef2f4ea4aULL},
|
|
748
|
+
{0xa9c2794ae3a3c69bULL, 0x4d14c78aafb224ddULL},
|
|
749
|
+
{0xd433179d9c8cb842ULL, 0xa059f96d5b9eae14ULL},
|
|
750
|
+
{0x849feec281d7f329ULL, 0x24383be459432cccULL},
|
|
751
|
+
{0xa5c7ea73224deff4ULL, 0xed464add6f93f7ffULL},
|
|
752
|
+
{0xcf39e50feae16bf0ULL, 0x2897dd94cb78f5ffULL},
|
|
753
|
+
{0x81842f29f2cce376ULL, 0x195eea7cff2b99bfULL},
|
|
754
|
+
{0xa1e53af46f801c54ULL, 0x9fb6a51c3ef6802fULL},
|
|
755
|
+
{0xca5e89b18b602369ULL, 0xc7a44e634eb4203bULL},
|
|
756
|
+
{0xfcf62c1dee382c43ULL, 0xb98d61fc2261284aULL},
|
|
757
|
+
{0x9e19db92b4e31baaULL, 0x93f85d3d957cb92eULL},
|
|
758
|
+
{0xc5a05277621be294ULL, 0x38f6748cfadbe77aULL},
|
|
759
|
+
{0xf70867153aa2db39ULL, 0x473411b03992e158ULL},
|
|
760
|
+
{0x9a65406d44a5c904ULL, 0x8c808b0e23fbccd7ULL},
|
|
761
|
+
{0xc0fe908895cf3b45ULL, 0xafa0add1acfac00dULL},
|
|
762
|
+
{0xf13e34aabb430a16ULL, 0x9b88d94618397010ULL},
|
|
763
|
+
{0x96c6e0eab509e64eULL, 0xa13587cbcf23e60aULL},
|
|
764
|
+
{0xbc789925624c5fe1ULL, 0x4982e9bec2ecdf8dULL},
|
|
765
|
+
{0xeb96bf6ebadf77d9ULL, 0x1be3a42e73a81770ULL},
|
|
766
|
+
{0x933e37a534cbaae8ULL, 0x716e469d08490ea6ULL},
|
|
767
|
+
{0xb80dc58e81fe95a2ULL, 0x8dc9d8444a5b524fULL},
|
|
768
|
+
{0xe61136f2227e3b0aULL, 0x313c4e555cf226e3ULL},
|
|
769
|
+
{0x8fcac257558ee4e7ULL, 0xdec5b0f55a17584eULL},
|
|
770
|
+
{0xb3bd72ed2af29e20ULL, 0x56771d32b09d2e62ULL},
|
|
771
|
+
{0xe0accfa875af45a8ULL, 0x6c14e47f5cc479faULL},
|
|
772
|
+
{0x8c6c01c9498d8b89ULL, 0x438d0ecf99facc3cULL},
|
|
773
|
+
{0xaf87023b9bf0ee6bULL, 0x1470528380797f4bULL},
|
|
774
|
+
{0xdb68c2ca82ed2a06ULL, 0x598c67246097df1eULL},
|
|
775
|
+
};
|
|
776
|
+
|
|
777
|
+
/* ======== Uscale core ======== */
|
|
778
|
+
|
|
779
|
+
static inline int log10_pow2(int x)
|
|
780
|
+
{
|
|
781
|
+
return (x * 78913) >> 18;
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
static inline int log2_pow10(int x)
|
|
785
|
+
{
|
|
786
|
+
return (x * 108853) >> 15;
|
|
787
|
+
}
|
|
788
|
+
|
|
789
|
+
typedef struct {
|
|
790
|
+
pow10_entry pm;
|
|
791
|
+
int s;
|
|
792
|
+
} scaler;
|
|
793
|
+
|
|
794
|
+
static inline scaler prescale(int e, int p, int lp)
|
|
795
|
+
{
|
|
796
|
+
scaler c;
|
|
797
|
+
c.pm = pow10_tab[p - POW10_MIN];
|
|
798
|
+
c.s = -(e + lp + 3);
|
|
799
|
+
return c;
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
typedef uint64_t unrounded;
|
|
803
|
+
|
|
804
|
+
static inline uint64_t ur_floor(unrounded u) { return (u + 0) >> 2; }
|
|
805
|
+
static inline uint64_t ur_round(unrounded u) { return (u + 1 + ((u >> 2) & 1)) >> 2; }
|
|
806
|
+
static inline uint64_t ur_ceil(unrounded u) { return (u + 3) >> 2; }
|
|
807
|
+
|
|
808
|
+
static inline unrounded ur_div(unrounded u, uint64_t d)
|
|
809
|
+
{
|
|
810
|
+
return (u / d) | (u & 1) | (u % d != 0 ? 1 : 0);
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
static inline unrounded ur_nudge(unrounded u, int delta)
|
|
814
|
+
{
|
|
815
|
+
return u + delta;
|
|
816
|
+
}
|
|
817
|
+
|
|
818
|
+
static unrounded uscale(uint64_t x, scaler c)
|
|
819
|
+
{
|
|
820
|
+
uint64_t hi, mid, mid2, lo_unused;
|
|
821
|
+
mul64(x, c.pm.hi, &hi, &mid);
|
|
822
|
+
|
|
823
|
+
uint64_t sticky = 1;
|
|
824
|
+
|
|
825
|
+
if (c.s >= 64) {
|
|
826
|
+
/* x * 10^p < 2^(c.s-64), i.e. < 1 in the unrounded "1.0 = 4" encoding;
|
|
827
|
+
rounds to 0 with sticky=1 */
|
|
828
|
+
return sticky;
|
|
829
|
+
}
|
|
830
|
+
|
|
831
|
+
uint64_t mask = (1ULL << c.s) - 1;
|
|
832
|
+
|
|
833
|
+
if ((hi & mask) == 0) {
|
|
834
|
+
mul64(x, c.pm.lo, &mid2, &lo_unused);
|
|
835
|
+
sticky = (mid - mid2) > 1 ? 1 : 0;
|
|
836
|
+
hi -= (mid < mid2) ? 1 : 0;
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
return (hi >> c.s) | sticky;
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
static void unpack64(double f, uint64_t *m, int *e)
|
|
843
|
+
{
|
|
844
|
+
const int shift = 64 - 53;
|
|
845
|
+
const int min_exp = -(1074 + shift);
|
|
846
|
+
union { double d; uint64_t u; } u;
|
|
847
|
+
u.d = f;
|
|
848
|
+
uint64_t bits = u.u;
|
|
849
|
+
int exp;
|
|
850
|
+
|
|
851
|
+
*m = (1ULL << 63) | ((bits & ((1ULL << 52) - 1)) << shift);
|
|
852
|
+
exp = (int)((bits >> 52) & ((1 << shift) - 1));
|
|
853
|
+
|
|
854
|
+
if (exp == 0) {
|
|
855
|
+
int s;
|
|
856
|
+
*m &= ~(1ULL << 63);
|
|
857
|
+
*e = min_exp;
|
|
858
|
+
s = clz64(*m);
|
|
859
|
+
*m <<= s;
|
|
860
|
+
*e -= s;
|
|
861
|
+
}
|
|
862
|
+
else {
|
|
863
|
+
*e = (exp - 1) + min_exp;
|
|
864
|
+
}
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
static double pack64(uint64_t m, int e)
|
|
868
|
+
{
|
|
869
|
+
union { double d; uint64_t u; } u;
|
|
870
|
+
if ((m & (1ULL << 52)) == 0) {
|
|
871
|
+
/* subnormal */
|
|
872
|
+
u.u = m;
|
|
873
|
+
}
|
|
874
|
+
else {
|
|
875
|
+
int biased = 1075 + e;
|
|
876
|
+
if (biased >= 2047) {
|
|
877
|
+
/* exponent overflow -> infinity */
|
|
878
|
+
u.u = 0x7FF0000000000000ULL;
|
|
879
|
+
}
|
|
880
|
+
else {
|
|
881
|
+
u.u = (m & ~(1ULL << 52)) | ((uint64_t)biased << 52);
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
return u.d;
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
/* ======== Algorithm helpers ======== */
|
|
888
|
+
|
|
889
|
+
static const uint64_t uint64_pow10[20] = {
|
|
890
|
+
1ULL, 10ULL, 100ULL, 1000ULL, 10000ULL,
|
|
891
|
+
100000ULL, 1000000ULL, 10000000ULL, 100000000ULL, 1000000000ULL,
|
|
892
|
+
10000000000ULL, 100000000000ULL, 1000000000000ULL, 10000000000000ULL,
|
|
893
|
+
100000000000000ULL, 1000000000000000ULL, 10000000000000000ULL,
|
|
894
|
+
100000000000000000ULL, 1000000000000000000ULL, 10000000000000000000ULL,
|
|
895
|
+
};
|
|
896
|
+
|
|
897
|
+
static int count_digits(uint64_t d)
|
|
898
|
+
{
|
|
899
|
+
if (d == 0) return 1; /* clz64(0) is UB; "0" is one digit */
|
|
900
|
+
int nd = log10_pow2(bits_len64(d));
|
|
901
|
+
return nd + (d >= uint64_pow10[nd] ? 1 : 0);
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
static void fixed_width(double f, int n, uint64_t *d, int *p)
|
|
905
|
+
{
|
|
906
|
+
uint64_t m;
|
|
907
|
+
int e;
|
|
908
|
+
unrounded u;
|
|
909
|
+
|
|
910
|
+
unpack64(f, &m, &e);
|
|
911
|
+
*p = n - 1 - log10_pow2(e + 63);
|
|
912
|
+
u = uscale(m, prescale(e, *p, log2_pow10(*p)));
|
|
913
|
+
*d = ur_round(u);
|
|
914
|
+
|
|
915
|
+
if (*d >= uint64_pow10[n]) {
|
|
916
|
+
*d = ur_round(ur_div(u, 10));
|
|
917
|
+
(*p)--;
|
|
918
|
+
}
|
|
919
|
+
*p = -(*p);
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
/*
|
|
923
|
+
* skewed returns floor(log10(3/4 * 2^e))
|
|
924
|
+
* Used for shortest-width printing at powers of 2
|
|
925
|
+
*/
|
|
926
|
+
static inline int skewed(int e)
|
|
927
|
+
{
|
|
928
|
+
return (e * 631305 - 261663) >> 21;
|
|
929
|
+
}
|
|
930
|
+
|
|
931
|
+
/*
|
|
932
|
+
* trim_zeros removes trailing zeros from x * 10^p
|
|
933
|
+
*/
|
|
934
|
+
static void trim_zeros(uint64_t *x, int *p)
|
|
935
|
+
{
|
|
936
|
+
const uint64_t inv5 = 0xcccccccccccccccdULL;
|
|
937
|
+
const uint64_t inv5p2 = 0x8f5c28f5c28f5c29ULL;
|
|
938
|
+
const uint64_t inv5p4 = 0xd288ce703afb7e91ULL;
|
|
939
|
+
const uint64_t inv5p8 = 0xc767074b22e90e21ULL;
|
|
940
|
+
uint64_t d;
|
|
941
|
+
|
|
942
|
+
/* cut 1 zero, or else return */
|
|
943
|
+
d = (*x * inv5);
|
|
944
|
+
d = (d >> 1) | (d << 63);
|
|
945
|
+
if (d <= UINT64_MAX / 10) {
|
|
946
|
+
*x = d;
|
|
947
|
+
(*p)++;
|
|
948
|
+
}
|
|
949
|
+
else {
|
|
950
|
+
return;
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
/* cut 8 zeros */
|
|
954
|
+
d = (*x * inv5p8);
|
|
955
|
+
d = (d >> 8) | (d << 56);
|
|
956
|
+
if (d <= UINT64_MAX / 100000000ULL) {
|
|
957
|
+
*x = d;
|
|
958
|
+
*p += 8;
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
/* cut 4 zeros */
|
|
962
|
+
d = (*x * inv5p4);
|
|
963
|
+
d = (d >> 4) | (d << 60);
|
|
964
|
+
if (d <= UINT64_MAX / 10000) {
|
|
965
|
+
*x = d;
|
|
966
|
+
*p += 4;
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
/* cut 2 zeros */
|
|
970
|
+
d = (*x * inv5p2);
|
|
971
|
+
d = (d >> 2) | (d << 62);
|
|
972
|
+
if (d <= UINT64_MAX / 100) {
|
|
973
|
+
*x = d;
|
|
974
|
+
*p += 2;
|
|
975
|
+
}
|
|
976
|
+
|
|
977
|
+
/* cut 1 zero */
|
|
978
|
+
d = (*x * inv5);
|
|
979
|
+
d = (d >> 1) | (d << 63);
|
|
980
|
+
if (d <= UINT64_MAX / 10) {
|
|
981
|
+
*x = d;
|
|
982
|
+
(*p)++;
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
/*
|
|
987
|
+
* shortest computes the shortest formatting of f
|
|
988
|
+
* Returns d and p such that d * 10^p equals f when parsed
|
|
989
|
+
*/
|
|
990
|
+
static void shortest(double f, uint64_t *d, int *p)
|
|
991
|
+
{
|
|
992
|
+
const int min_exp = -1085;
|
|
993
|
+
uint64_t m, min, max;
|
|
994
|
+
int e, z, odd, lp;
|
|
995
|
+
scaler pre;
|
|
996
|
+
uint64_t dmin, dmax;
|
|
997
|
+
|
|
998
|
+
unpack64(f, &m, &e);
|
|
999
|
+
z = 11;
|
|
1000
|
+
|
|
1001
|
+
if (m == (1ULL << 63) && e > min_exp) {
|
|
1002
|
+
*p = -skewed(e + z);
|
|
1003
|
+
min = m - (1ULL << (z - 2));
|
|
1004
|
+
}
|
|
1005
|
+
else {
|
|
1006
|
+
if (e < min_exp) {
|
|
1007
|
+
z = 11 + (min_exp - e);
|
|
1008
|
+
}
|
|
1009
|
+
*p = -log10_pow2(e + z);
|
|
1010
|
+
min = m - (1ULL << (z - 1));
|
|
1011
|
+
}
|
|
1012
|
+
max = m + (1ULL << (z - 1));
|
|
1013
|
+
odd = (int)((m >> z) & 1);
|
|
1014
|
+
|
|
1015
|
+
lp = log2_pow10(*p);
|
|
1016
|
+
pre = prescale(e, *p, lp);
|
|
1017
|
+
|
|
1018
|
+
dmin = ur_ceil(ur_nudge(uscale(min, pre), +odd));
|
|
1019
|
+
dmax = ur_floor(ur_nudge(uscale(max, pre), -odd));
|
|
1020
|
+
|
|
1021
|
+
/* check if a multiple of 10 is in range */
|
|
1022
|
+
*d = dmax / 10;
|
|
1023
|
+
if (*d * 10 >= dmin) {
|
|
1024
|
+
int new_p = -(*p - 1);
|
|
1025
|
+
trim_zeros(d, &new_p);
|
|
1026
|
+
*p = new_p;
|
|
1027
|
+
return;
|
|
1028
|
+
}
|
|
1029
|
+
|
|
1030
|
+
/* multiple valid values: pick the rounded one */
|
|
1031
|
+
if (dmin < dmax) {
|
|
1032
|
+
*d = ur_round(uscale(m, pre));
|
|
1033
|
+
}
|
|
1034
|
+
else {
|
|
1035
|
+
*d = dmin;
|
|
1036
|
+
}
|
|
1037
|
+
*p = -(*p);
|
|
1038
|
+
}
|
|
1039
|
+
|
|
1040
|
+
static double parse_decimal(uint64_t d, int p)
|
|
1041
|
+
{
|
|
1042
|
+
int b, lp, e;
|
|
1043
|
+
unrounded u;
|
|
1044
|
+
uint64_t m;
|
|
1045
|
+
|
|
1046
|
+
if (d == 0) return 0.0;
|
|
1047
|
+
|
|
1048
|
+
b = bits_len64(d);
|
|
1049
|
+
lp = log2_pow10(p);
|
|
1050
|
+
e = 53 - b - lp;
|
|
1051
|
+
if (e > 1074) e = 1074;
|
|
1052
|
+
|
|
1053
|
+
u = uscale(d << (64 - b), prescale(e - (64 - b), p, lp));
|
|
1054
|
+
m = ur_round(u);
|
|
1055
|
+
|
|
1056
|
+
if (m >= (1ULL << 53)) {
|
|
1057
|
+
u = (u >> 1) | (u & 1);
|
|
1058
|
+
m = ur_round(u);
|
|
1059
|
+
e--;
|
|
1060
|
+
}
|
|
1061
|
+
|
|
1062
|
+
return pack64(m, -e);
|
|
1063
|
+
}
|
|
1064
|
+
|
|
1065
|
+
/* ======== Formatting helpers ======== */
|
|
1066
|
+
|
|
1067
|
+
static const char i2a[] =
|
|
1068
|
+
"00010203040506070809"
|
|
1069
|
+
"10111213141516171819"
|
|
1070
|
+
"20212223242526272829"
|
|
1071
|
+
"30313233343536373839"
|
|
1072
|
+
"40414243444546474849"
|
|
1073
|
+
"50515253545556575859"
|
|
1074
|
+
"60616263646566676869"
|
|
1075
|
+
"70717273747576777879"
|
|
1076
|
+
"80818283848586878889"
|
|
1077
|
+
"90919293949596979899";
|
|
1078
|
+
|
|
1079
|
+
static void format_base10(char *buf, int nd, uint64_t u)
|
|
1080
|
+
{
|
|
1081
|
+
int idx;
|
|
1082
|
+
while (nd >= 2) {
|
|
1083
|
+
nd -= 2;
|
|
1084
|
+
idx = (int)(u % 100) * 2;
|
|
1085
|
+
u /= 100;
|
|
1086
|
+
buf[nd] = i2a[idx];
|
|
1087
|
+
buf[nd + 1] = i2a[idx + 1];
|
|
1088
|
+
}
|
|
1089
|
+
if (nd > 0) {
|
|
1090
|
+
buf[0] = '0' + (char)u;
|
|
1091
|
+
}
|
|
1092
|
+
}
|
|
1093
|
+
|
|
1094
|
+
static int
|
|
1095
|
+
emit_exp(char *s, char e_char, int exp)
|
|
1096
|
+
{
|
|
1097
|
+
char *p = s;
|
|
1098
|
+
*p++ = e_char;
|
|
1099
|
+
if (exp < 0) {
|
|
1100
|
+
*p++ = '-';
|
|
1101
|
+
exp = -exp;
|
|
1102
|
+
}
|
|
1103
|
+
else {
|
|
1104
|
+
*p++ = '+';
|
|
1105
|
+
}
|
|
1106
|
+
if (exp >= 100) {
|
|
1107
|
+
*p++ = '0' + exp / 100;
|
|
1108
|
+
exp %= 100;
|
|
1109
|
+
}
|
|
1110
|
+
*p++ = '0' + exp / 10;
|
|
1111
|
+
*p++ = '0' + exp % 10;
|
|
1112
|
+
return (int)(p - s);
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1115
|
+
/* Spinel addition (not in mruby's fp_uscale.c): expose the shortest-round-trip
|
|
1116
|
+
significant digits and the decimal exponent of the leading digit, so callers
|
|
1117
|
+
can apply their own fixed/scientific layout (Ruby's Float#to_s threshold
|
|
1118
|
+
differs from %g's). `digs` gets the NUL-terminated significant digits, *nd
|
|
1119
|
+
their count; the return value is the base-10 exponent of digs[0]. Only for a
|
|
1120
|
+
finite non-zero f (the caller handles 0/inf/nan). */
|
|
1121
|
+
int sp_float_shortest(double f, char *digs, int *nd) {
|
|
1122
|
+
uint64_t d; int p;
|
|
1123
|
+
shortest(f, &d, &p);
|
|
1124
|
+
int n = count_digits(d);
|
|
1125
|
+
format_base10(digs, n, d);
|
|
1126
|
+
digs[n] = '\0';
|
|
1127
|
+
*nd = n;
|
|
1128
|
+
return p + n - 1;
|
|
1129
|
+
}
|
|
1130
|
+
|
|
1131
|
+
/* ======== sp_format_float ======== */
|
|
1132
|
+
|
|
1133
|
+
#ifdef MRB_USE_FLOAT32
|
|
1134
|
+
#define FLT_MIN_BUF_SIZE 6
|
|
1135
|
+
#else
|
|
1136
|
+
#define FLT_MIN_BUF_SIZE 7
|
|
1137
|
+
#endif
|
|
1138
|
+
|
|
1139
|
+
int
|
|
1140
|
+
sp_format_float(sp_float f, char *buf, size_t buf_size, char fmt, int prec, char sign)
|
|
1141
|
+
{
|
|
1142
|
+
char *s = buf;
|
|
1143
|
+
int buf_remaining = (int)buf_size - 1;
|
|
1144
|
+
int alt_form = 0;
|
|
1145
|
+
char e_char;
|
|
1146
|
+
|
|
1147
|
+
if ((uint8_t)fmt & 0x80) {
|
|
1148
|
+
fmt &= 0x7f;
|
|
1149
|
+
alt_form = 1;
|
|
1150
|
+
}
|
|
1151
|
+
if (buf_size <= (size_t)FLT_MIN_BUF_SIZE) {
|
|
1152
|
+
if (buf_size >= 2) *s++ = '?';
|
|
1153
|
+
if (buf_size >= 1) *s = '\0';
|
|
1154
|
+
return buf_size >= 2;
|
|
1155
|
+
}
|
|
1156
|
+
if (signbit(f)) {
|
|
1157
|
+
*s++ = '-';
|
|
1158
|
+
f = -f;
|
|
1159
|
+
}
|
|
1160
|
+
else if (sign) {
|
|
1161
|
+
*s++ = sign;
|
|
1162
|
+
}
|
|
1163
|
+
buf_remaining -= (int)(s - buf);
|
|
1164
|
+
|
|
1165
|
+
{
|
|
1166
|
+
char uc = fmt & 0x20;
|
|
1167
|
+
if (isinf(f)) {
|
|
1168
|
+
*s++ = 'I' ^ uc;
|
|
1169
|
+
*s++ = 'N' ^ uc;
|
|
1170
|
+
*s++ = 'F' ^ uc;
|
|
1171
|
+
goto done;
|
|
1172
|
+
}
|
|
1173
|
+
if (isnan(f)) {
|
|
1174
|
+
*s++ = 'N' ^ uc;
|
|
1175
|
+
*s++ = 'A' ^ uc;
|
|
1176
|
+
*s++ = 'N' ^ uc;
|
|
1177
|
+
goto done;
|
|
1178
|
+
}
|
|
1179
|
+
}
|
|
1180
|
+
|
|
1181
|
+
{
|
|
1182
|
+
int use_shortest = (prec == -2);
|
|
1183
|
+
if (prec < 0) prec = 6;
|
|
1184
|
+
e_char = 'E' | (fmt & 0x20);
|
|
1185
|
+
fmt |= 0x20;
|
|
1186
|
+
if (fmt == 'g') {
|
|
1187
|
+
if (use_shortest) fmt = 'S'; /* shortest mode */
|
|
1188
|
+
else if (prec == 0) prec = 1;
|
|
1189
|
+
}
|
|
1190
|
+
}
|
|
1191
|
+
|
|
1192
|
+
if (f == 0.0) {
|
|
1193
|
+
/* zero */
|
|
1194
|
+
if (fmt == 'e') {
|
|
1195
|
+
*s++ = '0';
|
|
1196
|
+
if (prec > 0 || alt_form) {
|
|
1197
|
+
int i;
|
|
1198
|
+
if (prec > buf_remaining - 5) prec = buf_remaining - 5;
|
|
1199
|
+
*s++ = '.';
|
|
1200
|
+
for (i = 0; i < prec; i++) *s++ = '0';
|
|
1201
|
+
}
|
|
1202
|
+
s += emit_exp(s, e_char, 0);
|
|
1203
|
+
}
|
|
1204
|
+
else if (fmt == 'f') {
|
|
1205
|
+
int i;
|
|
1206
|
+
if (prec > buf_remaining - 2) prec = buf_remaining - 2;
|
|
1207
|
+
*s++ = '0';
|
|
1208
|
+
if (prec > 0 || alt_form) {
|
|
1209
|
+
*s++ = '.';
|
|
1210
|
+
for (i = 0; i < prec; i++) *s++ = '0';
|
|
1211
|
+
}
|
|
1212
|
+
}
|
|
1213
|
+
else { /* g */
|
|
1214
|
+
*s++ = '0';
|
|
1215
|
+
if (alt_form && prec > 1) {
|
|
1216
|
+
int i;
|
|
1217
|
+
*s++ = '.';
|
|
1218
|
+
for (i = 1; i < prec; i++) *s++ = '0';
|
|
1219
|
+
}
|
|
1220
|
+
}
|
|
1221
|
+
}
|
|
1222
|
+
else {
|
|
1223
|
+
/* nonzero finite */
|
|
1224
|
+
uint64_t d;
|
|
1225
|
+
int p, nd, exp;
|
|
1226
|
+
char digs[20] = {0}; /* gcc -Wmaybe-uninitialized false positive: count_digits() always returns >= 1 */
|
|
1227
|
+
|
|
1228
|
+
if (fmt == 'S') {
|
|
1229
|
+
/* shortest representation for to_s */
|
|
1230
|
+
int i;
|
|
1231
|
+
shortest((double)f, &d, &p);
|
|
1232
|
+
nd = count_digits(d);
|
|
1233
|
+
exp = p + nd - 1;
|
|
1234
|
+
format_base10(digs, nd, d);
|
|
1235
|
+
|
|
1236
|
+
#ifdef MRB_USE_FLOAT32
|
|
1237
|
+
if (exp < -4 || exp >= 7) {
|
|
1238
|
+
#else
|
|
1239
|
+
if (exp < -4 || exp >= 15) {
|
|
1240
|
+
#endif
|
|
1241
|
+
/* e format */
|
|
1242
|
+
*s++ = digs[0];
|
|
1243
|
+
if (nd > 1) {
|
|
1244
|
+
*s++ = '.';
|
|
1245
|
+
for (i = 1; i < nd; i++) *s++ = digs[i];
|
|
1246
|
+
}
|
|
1247
|
+
s += emit_exp(s, e_char, exp);
|
|
1248
|
+
}
|
|
1249
|
+
else {
|
|
1250
|
+
/* f format */
|
|
1251
|
+
if (exp < 0) {
|
|
1252
|
+
*s++ = '0';
|
|
1253
|
+
*s++ = '.';
|
|
1254
|
+
for (i = 0; i < -(exp + 1); i++) *s++ = '0';
|
|
1255
|
+
for (i = 0; i < nd; i++) *s++ = digs[i];
|
|
1256
|
+
}
|
|
1257
|
+
else {
|
|
1258
|
+
for (i = 0; i <= exp && i < nd; i++) *s++ = digs[i];
|
|
1259
|
+
for (; i <= exp; i++) *s++ = '0';
|
|
1260
|
+
if (nd > exp + 1) {
|
|
1261
|
+
*s++ = '.';
|
|
1262
|
+
for (i = exp + 1; i < nd; i++) *s++ = digs[i];
|
|
1263
|
+
}
|
|
1264
|
+
}
|
|
1265
|
+
}
|
|
1266
|
+
}
|
|
1267
|
+
else if (fmt == 'g') {
|
|
1268
|
+
/* g/G format */
|
|
1269
|
+
int fprec, n = prec;
|
|
1270
|
+
if (n > 18) n = 18;
|
|
1271
|
+
if (n < 1) n = 1;
|
|
1272
|
+
fixed_width((double)f, n, &d, &p);
|
|
1273
|
+
nd = count_digits(d);
|
|
1274
|
+
exp = p + nd - 1;
|
|
1275
|
+
|
|
1276
|
+
if (exp < -4 || exp >= prec) {
|
|
1277
|
+
/* use e format with prec-1 fractional digits */
|
|
1278
|
+
fprec = prec - 1;
|
|
1279
|
+
format_base10(digs, nd, d);
|
|
1280
|
+
*s++ = digs[0];
|
|
1281
|
+
if (fprec > 0 || alt_form) {
|
|
1282
|
+
int i, end = fprec < nd - 1 ? fprec : nd - 1;
|
|
1283
|
+
*s++ = '.';
|
|
1284
|
+
for (i = 0; i < end; i++) *s++ = digs[1 + i];
|
|
1285
|
+
for (; i < fprec; i++) *s++ = '0';
|
|
1286
|
+
}
|
|
1287
|
+
if (!alt_form) {
|
|
1288
|
+
/* strip trailing zeros */
|
|
1289
|
+
while (s > buf && s[-1] == '0') s--;
|
|
1290
|
+
if (s > buf && s[-1] == '.') s--;
|
|
1291
|
+
}
|
|
1292
|
+
s += emit_exp(s, e_char, exp);
|
|
1293
|
+
}
|
|
1294
|
+
else {
|
|
1295
|
+
/* use f format with prec-(exp+1) fractional digits */
|
|
1296
|
+
int i;
|
|
1297
|
+
fprec = prec - (exp + 1);
|
|
1298
|
+
format_base10(digs, nd, d);
|
|
1299
|
+
/* integer part */
|
|
1300
|
+
if (exp < 0) {
|
|
1301
|
+
*s++ = '0';
|
|
1302
|
+
}
|
|
1303
|
+
else {
|
|
1304
|
+
for (i = 0; i <= exp && i < nd; i++) *s++ = digs[i];
|
|
1305
|
+
for (; i <= exp; i++) *s++ = '0';
|
|
1306
|
+
}
|
|
1307
|
+
if (fprec > 0 || alt_form) {
|
|
1308
|
+
int frac_avail;
|
|
1309
|
+
*s++ = '.';
|
|
1310
|
+
if (exp < 0) {
|
|
1311
|
+
int zeros = -(exp + 1);
|
|
1312
|
+
for (i = 0; i < zeros && i < fprec; i++) *s++ = '0';
|
|
1313
|
+
frac_avail = fprec - zeros;
|
|
1314
|
+
for (i = 0; i < frac_avail && i < nd; i++) *s++ = digs[i];
|
|
1315
|
+
for (; i < frac_avail; i++) *s++ = '0';
|
|
1316
|
+
}
|
|
1317
|
+
else {
|
|
1318
|
+
frac_avail = nd - exp - 1;
|
|
1319
|
+
if (frac_avail < 0) frac_avail = 0;
|
|
1320
|
+
for (i = 0; i < frac_avail && i < fprec; i++) *s++ = digs[exp + 1 + i];
|
|
1321
|
+
for (; i < fprec; i++) *s++ = '0';
|
|
1322
|
+
}
|
|
1323
|
+
}
|
|
1324
|
+
if (!alt_form && fprec > 0) {
|
|
1325
|
+
while (s[-1] == '0') s--;
|
|
1326
|
+
if (s[-1] == '.') s--;
|
|
1327
|
+
}
|
|
1328
|
+
}
|
|
1329
|
+
}
|
|
1330
|
+
else if (fmt == 'e') {
|
|
1331
|
+
/* e/E format */
|
|
1332
|
+
int n = prec + 1;
|
|
1333
|
+
int i;
|
|
1334
|
+
if (n > 18) n = 18;
|
|
1335
|
+
if (n < 1) n = 1;
|
|
1336
|
+
fixed_width((double)f, n, &d, &p);
|
|
1337
|
+
nd = count_digits(d);
|
|
1338
|
+
exp = p + nd - 1;
|
|
1339
|
+
format_base10(digs, nd, d);
|
|
1340
|
+
*s++ = digs[0];
|
|
1341
|
+
if (prec > 0 || alt_form) {
|
|
1342
|
+
*s++ = '.';
|
|
1343
|
+
for (i = 1; i < nd; i++) *s++ = digs[i];
|
|
1344
|
+
for (i = nd - 1; i < prec; i++) *s++ = '0';
|
|
1345
|
+
}
|
|
1346
|
+
s += emit_exp(s, e_char, exp);
|
|
1347
|
+
}
|
|
1348
|
+
else {
|
|
1349
|
+
/* f/F format */
|
|
1350
|
+
int exp_est, i;
|
|
1351
|
+
union { double d; uint64_t u; } uf;
|
|
1352
|
+
uf.d = (double)f;
|
|
1353
|
+
exp_est = log10_pow2((int)((uf.u >> 52) & 0x7FF) - 1023);
|
|
1354
|
+
|
|
1355
|
+
if (exp_est >= buf_remaining) {
|
|
1356
|
+
/* too big for f, use e */
|
|
1357
|
+
int n = prec + 1;
|
|
1358
|
+
if (n > 18) n = 18;
|
|
1359
|
+
if (n < 1) n = 1;
|
|
1360
|
+
fixed_width((double)f, n, &d, &p);
|
|
1361
|
+
nd = count_digits(d);
|
|
1362
|
+
exp = p + nd - 1;
|
|
1363
|
+
format_base10(digs, nd, d);
|
|
1364
|
+
*s++ = digs[0];
|
|
1365
|
+
if (prec > 0 || alt_form) {
|
|
1366
|
+
*s++ = '.';
|
|
1367
|
+
for (i = 1; i < nd; i++) *s++ = digs[i];
|
|
1368
|
+
for (i = nd - 1; i < prec; i++) *s++ = '0';
|
|
1369
|
+
}
|
|
1370
|
+
s += emit_exp(s, e_char, exp);
|
|
1371
|
+
}
|
|
1372
|
+
else {
|
|
1373
|
+
if ((exp_est + prec + 2) > buf_remaining) {
|
|
1374
|
+
prec = buf_remaining - exp_est - 2;
|
|
1375
|
+
if (prec < 0) prec = 0;
|
|
1376
|
+
}
|
|
1377
|
+
|
|
1378
|
+
if (exp_est + prec <= 17) {
|
|
1379
|
+
/* Direct uscale: compute round(f * 10^prec) */
|
|
1380
|
+
uint64_t m;
|
|
1381
|
+
int e, lp;
|
|
1382
|
+
unrounded u;
|
|
1383
|
+
unpack64((double)f, &m, &e);
|
|
1384
|
+
lp = log2_pow10(prec);
|
|
1385
|
+
u = uscale(m, prescale(e, prec, lp));
|
|
1386
|
+
d = ur_round(u);
|
|
1387
|
+
nd = count_digits(d);
|
|
1388
|
+
exp = nd - prec - 1;
|
|
1389
|
+
}
|
|
1390
|
+
else {
|
|
1391
|
+
/* Large number: use fixed_width, pad with zeros */
|
|
1392
|
+
int n = 18;
|
|
1393
|
+
fixed_width((double)f, n, &d, &p);
|
|
1394
|
+
nd = count_digits(d);
|
|
1395
|
+
exp = p + nd - 1;
|
|
1396
|
+
}
|
|
1397
|
+
format_base10(digs, nd, d);
|
|
1398
|
+
|
|
1399
|
+
if (exp >= 0) {
|
|
1400
|
+
for (i = 0; i < nd && i <= exp; i++) *s++ = digs[i];
|
|
1401
|
+
for (; i <= exp; i++) *s++ = '0';
|
|
1402
|
+
if (prec > 0 || alt_form) {
|
|
1403
|
+
int frac_avail = nd - exp - 1;
|
|
1404
|
+
if (frac_avail < 0) frac_avail = 0;
|
|
1405
|
+
*s++ = '.';
|
|
1406
|
+
for (i = 0; i < frac_avail && i < prec; i++) *s++ = digs[exp + 1 + i];
|
|
1407
|
+
for (; i < prec; i++) *s++ = '0';
|
|
1408
|
+
}
|
|
1409
|
+
}
|
|
1410
|
+
else {
|
|
1411
|
+
int zeros, frac_avail;
|
|
1412
|
+
*s++ = '0';
|
|
1413
|
+
if (prec > 0 || alt_form) {
|
|
1414
|
+
*s++ = '.';
|
|
1415
|
+
zeros = -(exp + 1);
|
|
1416
|
+
for (i = 0; i < zeros && i < prec; i++) *s++ = '0';
|
|
1417
|
+
frac_avail = prec - zeros;
|
|
1418
|
+
for (i = 0; i < frac_avail && i < nd; i++) *s++ = digs[i];
|
|
1419
|
+
for (; i < frac_avail; i++) *s++ = '0';
|
|
1420
|
+
}
|
|
1421
|
+
}
|
|
1422
|
+
}
|
|
1423
|
+
}
|
|
1424
|
+
}
|
|
1425
|
+
|
|
1426
|
+
done:
|
|
1427
|
+
*s = '\0';
|
|
1428
|
+
return (int)(s - buf);
|
|
1429
|
+
}
|
|
1430
|
+
|
|
1431
|
+
/* ======== sp_read_float ======== */
|
|
1432
|
+
|
|
1433
|
+
sp_bool
|
|
1434
|
+
sp_read_float(const char *str, char **endp, double *fp)
|
|
1435
|
+
{
|
|
1436
|
+
const char *p = str;
|
|
1437
|
+
const char *a = p;
|
|
1438
|
+
uint64_t d = 0;
|
|
1439
|
+
int nd = 0;
|
|
1440
|
+
int dp = 0;
|
|
1441
|
+
int trunc = 0;
|
|
1442
|
+
int sign = 1;
|
|
1443
|
+
int any_digits = 0;
|
|
1444
|
+
|
|
1445
|
+
while (ISSPACE((unsigned char)*p)) p++;
|
|
1446
|
+
|
|
1447
|
+
if (*p == '-') { sign = -1; p++; }
|
|
1448
|
+
else if (*p == '+') p++;
|
|
1449
|
+
|
|
1450
|
+
/* skip leading zeros */
|
|
1451
|
+
while (*p == '0') { p++; any_digits = 1; }
|
|
1452
|
+
|
|
1453
|
+
/* integer part */
|
|
1454
|
+
while (ISDIGIT(*p)) {
|
|
1455
|
+
if (nd < 19) {
|
|
1456
|
+
d = d * 10 + (*p - '0');
|
|
1457
|
+
nd++;
|
|
1458
|
+
}
|
|
1459
|
+
else {
|
|
1460
|
+
trunc++;
|
|
1461
|
+
}
|
|
1462
|
+
any_digits = 1;
|
|
1463
|
+
a = ++p;
|
|
1464
|
+
}
|
|
1465
|
+
|
|
1466
|
+
/* fractional part */
|
|
1467
|
+
if (*p == '.') {
|
|
1468
|
+
p++;
|
|
1469
|
+
if (nd == 0) {
|
|
1470
|
+
while (*p == '0') { dp++; p++; any_digits = 1; }
|
|
1471
|
+
}
|
|
1472
|
+
while (ISDIGIT(*p)) {
|
|
1473
|
+
if (nd < 19) {
|
|
1474
|
+
d = d * 10 + (*p - '0');
|
|
1475
|
+
nd++;
|
|
1476
|
+
dp++;
|
|
1477
|
+
}
|
|
1478
|
+
any_digits = 1;
|
|
1479
|
+
p++;
|
|
1480
|
+
}
|
|
1481
|
+
a = p;
|
|
1482
|
+
}
|
|
1483
|
+
|
|
1484
|
+
if (!any_digits) {
|
|
1485
|
+
if (endp) *endp = (char*)str;
|
|
1486
|
+
*fp = 0.0;
|
|
1487
|
+
return FALSE;
|
|
1488
|
+
}
|
|
1489
|
+
|
|
1490
|
+
/* exponent (optional). On malformed exponent ("5e", "5e+"), keep `a`
|
|
1491
|
+
pointing at the 'e' so the caller's *endp reflects where parsing
|
|
1492
|
+
stopped, and fall through using the mantissa-only result. */
|
|
1493
|
+
int final_p = trunc - dp;
|
|
1494
|
+
if ((*p | 32) == 'e') {
|
|
1495
|
+
int e = 0;
|
|
1496
|
+
int exp_sign = 1;
|
|
1497
|
+
p++;
|
|
1498
|
+
if (*p == '-') { exp_sign = -1; p++; }
|
|
1499
|
+
else if (*p == '+') p++;
|
|
1500
|
+
|
|
1501
|
+
if (ISDIGIT(*p)) {
|
|
1502
|
+
while (ISDIGIT(*p)) {
|
|
1503
|
+
if (e < 10000) e = e * 10 + (*p - '0');
|
|
1504
|
+
p++;
|
|
1505
|
+
}
|
|
1506
|
+
final_p += e * exp_sign;
|
|
1507
|
+
a = p;
|
|
1508
|
+
}
|
|
1509
|
+
}
|
|
1510
|
+
|
|
1511
|
+
{
|
|
1512
|
+
double res;
|
|
1513
|
+
if (d == 0) {
|
|
1514
|
+
res = 0.0;
|
|
1515
|
+
}
|
|
1516
|
+
else if (final_p > 308) {
|
|
1517
|
+
res = HUGE_VAL;
|
|
1518
|
+
}
|
|
1519
|
+
else if (final_p < POW10_MIN) {
|
|
1520
|
+
res = 0.0;
|
|
1521
|
+
}
|
|
1522
|
+
else {
|
|
1523
|
+
res = parse_decimal(d, final_p);
|
|
1524
|
+
}
|
|
1525
|
+
if (sign < 0) res = -res;
|
|
1526
|
+
*fp = res;
|
|
1527
|
+
}
|
|
1528
|
+
|
|
1529
|
+
if (endp) *endp = (char*)a;
|
|
1530
|
+
return TRUE;
|
|
1531
|
+
}
|
|
1532
|
+
|
|
1533
|
+
#endif /* MRB_NO_FLOAT */
|