summaryrefslogtreecommitdiffstats
path: root/vendor/serde_json/src/lexical/cached_float80.rs
blob: 9beda3ddb1d8dcf2617229916137dca977ad4aa9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
// Adapted from https://github.com/Alexhuszagh/rust-lexical.

//! Cached exponents for basen values with 80-bit extended floats.
//!
//! Exact versions of base**n as an extended-precision float, with both
//! large and small powers. Use the large powers to minimize the amount
//! of compounded error.
//!
//! These values were calculated using Python, using the arbitrary-precision
//! integer to calculate exact extended-representation of each value.
//! These values are all normalized.

use super::cached::{ExtendedFloatArray, ModeratePathPowers};

// LOW-LEVEL
// ---------

// BASE10

const BASE10_SMALL_MANTISSA: [u64; 10] = [
    9223372036854775808,  // 10^0
    11529215046068469760, // 10^1
    14411518807585587200, // 10^2
    18014398509481984000, // 10^3
    11258999068426240000, // 10^4
    14073748835532800000, // 10^5
    17592186044416000000, // 10^6
    10995116277760000000, // 10^7
    13743895347200000000, // 10^8
    17179869184000000000, // 10^9
];
const BASE10_SMALL_EXPONENT: [i32; 10] = [
    -63, // 10^0
    -60, // 10^1
    -57, // 10^2
    -54, // 10^3
    -50, // 10^4
    -47, // 10^5
    -44, // 10^6
    -40, // 10^7
    -37, // 10^8
    -34, // 10^9
];
const BASE10_LARGE_MANTISSA: [u64; 66] = [
    11555125961253852697, // 10^-350
    13451937075301367670, // 10^-340
    15660115838168849784, // 10^-330
    18230774251475056848, // 10^-320
    10611707258198326947, // 10^-310
    12353653155963782858, // 10^-300
    14381545078898527261, // 10^-290
    16742321987285426889, // 10^-280
    9745314011399999080,  // 10^-270
    11345038669416679861, // 10^-260
    13207363278391631158, // 10^-250
    15375394465392026070, // 10^-240
    17899314949046850752, // 10^-230
    10418772551374772303, // 10^-220
    12129047596099288555, // 10^-210
    14120069793541087484, // 10^-200
    16437924692338667210, // 10^-190
    9568131466127621947,  // 10^-180
    11138771039116687545, // 10^-170
    12967236152753102995, // 10^-160
    15095849699286165408, // 10^-150
    17573882009934360870, // 10^-140
    10229345649675443343, // 10^-130
    11908525658859223294, // 10^-120
    13863348470604074297, // 10^-110
    16139061738043178685, // 10^-100
    9394170331095332911,  // 10^-90
    10936253623915059621, // 10^-80
    12731474852090538039, // 10^-70
    14821387422376473014, // 10^-60
    17254365866976409468, // 10^-50
    10043362776618689222, // 10^-40
    11692013098647223345, // 10^-30
    13611294676837538538, // 10^-20
    15845632502852867518, // 10^-10
    9223372036854775808,  // 10^0
    10737418240000000000, // 10^10
    12500000000000000000, // 10^20
    14551915228366851806, // 10^30
    16940658945086006781, // 10^40
    9860761315262647567,  // 10^50
    11479437019748901445, // 10^60
    13363823550460978230, // 10^70
    15557538194652854267, // 10^80
    18111358157653424735, // 10^90
    10542197943230523224, // 10^100
    12272733663244316382, // 10^110
    14287342391028437277, // 10^120
    16632655625031838749, // 10^130
    9681479787123295682,  // 10^140
    11270725851789228247, // 10^150
    13120851772591970218, // 10^160
    15274681817498023410, // 10^170
    17782069995880619867, // 10^180
    10350527006597618960, // 10^190
    12049599325514420588, // 10^200
    14027579833653779454, // 10^210
    16330252207878254650, // 10^220
    9505457831475799117,  // 10^230
    11065809325636130661, // 10^240
    12882297539194266616, // 10^250
    14996968138956309548, // 10^260
    17458768723248864463, // 10^270
    10162340898095201970, // 10^280
    11830521861667747109, // 10^290
    13772540099066387756, // 10^300
];
const BASE10_LARGE_EXPONENT: [i32; 66] = [
    -1226, // 10^-350
    -1193, // 10^-340
    -1160, // 10^-330
    -1127, // 10^-320
    -1093, // 10^-310
    -1060, // 10^-300
    -1027, // 10^-290
    -994,  // 10^-280
    -960,  // 10^-270
    -927,  // 10^-260
    -894,  // 10^-250
    -861,  // 10^-240
    -828,  // 10^-230
    -794,  // 10^-220
    -761,  // 10^-210
    -728,  // 10^-200
    -695,  // 10^-190
    -661,  // 10^-180
    -628,  // 10^-170
    -595,  // 10^-160
    -562,  // 10^-150
    -529,  // 10^-140
    -495,  // 10^-130
    -462,  // 10^-120
    -429,  // 10^-110
    -396,  // 10^-100
    -362,  // 10^-90
    -329,  // 10^-80
    -296,  // 10^-70
    -263,  // 10^-60
    -230,  // 10^-50
    -196,  // 10^-40
    -163,  // 10^-30
    -130,  // 10^-20
    -97,   // 10^-10
    -63,   // 10^0
    -30,   // 10^10
    3,     // 10^20
    36,    // 10^30
    69,    // 10^40
    103,   // 10^50
    136,   // 10^60
    169,   // 10^70
    202,   // 10^80
    235,   // 10^90
    269,   // 10^100
    302,   // 10^110
    335,   // 10^120
    368,   // 10^130
    402,   // 10^140
    435,   // 10^150
    468,   // 10^160
    501,   // 10^170
    534,   // 10^180
    568,   // 10^190
    601,   // 10^200
    634,   // 10^210
    667,   // 10^220
    701,   // 10^230
    734,   // 10^240
    767,   // 10^250
    800,   // 10^260
    833,   // 10^270
    867,   // 10^280
    900,   // 10^290
    933,   // 10^300
];
const BASE10_SMALL_INT_POWERS: [u64; 10] = [
    1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000,
];
const BASE10_STEP: i32 = 10;
const BASE10_BIAS: i32 = 350;

// HIGH LEVEL
// ----------

const BASE10_POWERS: ModeratePathPowers = ModeratePathPowers {
    small: ExtendedFloatArray {
        mant: &BASE10_SMALL_MANTISSA,
        exp: &BASE10_SMALL_EXPONENT,
    },
    large: ExtendedFloatArray {
        mant: &BASE10_LARGE_MANTISSA,
        exp: &BASE10_LARGE_EXPONENT,
    },
    small_int: &BASE10_SMALL_INT_POWERS,
    step: BASE10_STEP,
    bias: BASE10_BIAS,
};

/// Get powers from base.
pub(crate) fn get_powers() -> &'static ModeratePathPowers {
    &BASE10_POWERS
}