• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

JuliaLang / julia / #37919

29 Sep 2024 09:41AM UTC coverage: 86.232% (-0.3%) from 86.484%
#37919

push

local

web-flow
fix rawbigints OOB issues (#55917)

Fixes issues introduced in #50691 and found in #55906:
* use `@inbounds` and `@boundscheck` macros in rawbigints, for catching
OOB with `--check-bounds=yes`
* fix OOB in `truncate`

12 of 13 new or added lines in 1 file covered. (92.31%)

1287 existing lines in 41 files now uncovered.

77245 of 89578 relevant lines covered (86.23%)

15686161.83 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

90.24
/stdlib/Random/src/normal.jl
1
# This file is a part of Julia. License is MIT: https://julialang.org/license
2

3
# Normally distributed random numbers using Ziggurat algorithm
4

5
# The Ziggurat Method for generating random variables - Marsaglia and Tsang
6
# Paper and reference code: https://www.jstatsoft.org/v05/i08/
7

8
# randmtzig (covers also exponential variates)
9

10
## randn
11

12
"""
13
    randn([rng=default_rng()], [T=Float64], [dims...])
14

15
Generate a normally-distributed random number of type `T`
16
with mean 0 and standard deviation 1.
17
Given the optional `dims` argument(s), generate an array of size `dims` of such numbers.
18
Julia's standard library supports `randn` for any floating-point type
19
that implements [`rand`](@ref), e.g. the `Base` types
20
[`Float16`](@ref), [`Float32`](@ref), [`Float64`](@ref) (the default), and [`BigFloat`](@ref),
21
along with their [`Complex`](@ref) counterparts.
22

23
(When `T` is complex, the values are drawn
24
from the circularly symmetric complex normal distribution of variance 1, corresponding to real and imaginary parts
25
having independent normal distribution with mean zero and variance `1/2`).
26

27
See also [`randn!`](@ref) to act in-place.
28

29
# Examples
30

31
Generating a single random number (with the default `Float64` type):
32

33
```julia-repl
34
julia> randn()
35
-0.942481877315864
36
```
37

38
Generating a matrix of normal random numbers (with the default `Float64` type):
39

40
```julia-repl
41
julia> randn(2,3)
42
2×3 Matrix{Float64}:
43
  1.18786   -0.678616   1.49463
44
 -0.342792  -0.134299  -1.45005
45
```
46

47
Setting up of the random number generator `rng` with a user-defined seed (for reproducible numbers)
48
and using it to generate a random `Float32` number or a matrix of `ComplexF32` random numbers:
49

50
```jldoctest
51
julia> using Random
52

53
julia> rng = Xoshiro(123);
54

55
julia> randn(rng, Float32)
56
-0.6457307f0
57

58
julia> randn(rng, ComplexF32, (2, 3))
59
2×3 Matrix{ComplexF32}:
60
  -1.03467-1.14806im  0.693657+0.056538im   0.291442+0.419454im
61
 -0.153912+0.34807im    1.0954-0.948661im  -0.543347-0.0538589im
62
```
63
"""
64
@inline function randn(rng::AbstractRNG=default_rng())
103,687✔
65
    #=
66
    When defining
67
    `@inline randn(rng::AbstractRNG=default_rng()) = _randn(rng, rand(rng, UInt52Raw()))`
68
    the function call to `_randn` is currently not inlined, resulting in slightly worse
69
    performance for scalar random normal numbers than repeating the code of `_randn`
70
    inside the following function.
71
    =#
72
    @inbounds begin
11,099,338✔
73
        r = rand(rng, UInt52())
11,089,050✔
74

75
        # the following code is identical to the one in `_randn(rng::AbstractRNG, r::UInt64)`
76
        rabs = Int64(r>>1) # One bit for the sign
11,089,050✔
77
        idx = rabs & 0xFF
11,089,050✔
78
        x = ifelse(r % Bool, -rabs, rabs)*wi[idx+1]
11,089,050✔
79
        rabs < ki[idx+1] && return x # 99.3% of the time we return here 1st try
11,089,050✔
80
        return randn_unlikely(rng, idx, rabs, x)
165,177✔
81
    end
82
end
83

84
@inline function _randn(rng::AbstractRNG, r::UInt64)
85
    @inbounds begin
4,528,062✔
86
        r &= 0x000fffffffffffff
4,528,062✔
87
        rabs = Int64(r>>1) # One bit for the sign
4,528,062✔
88
        idx = rabs & 0xFF
4,528,062✔
89
        x = ifelse(r % Bool, -rabs, rabs)*wi[idx+1]
4,528,062✔
90
        rabs < ki[idx+1] && return x # 99.3% of the time we return here 1st try
4,528,062✔
91
        return randn_unlikely(rng, idx, rabs, x)
66,999✔
92
    end
93
end
94

95
# this unlikely branch is put in a separate function for better efficiency
96
@noinline function randn_unlikely(rng, idx, rabs, x)
232,176✔
97
    @inbounds if idx == 0
232,176✔
98
        while true
4,290✔
99
            xx = -ziggurat_nor_inv_r*log1p(-rand(rng))
4,290✔
100
            yy = -log1p(-rand(rng))
4,290✔
101
            yy+yy > xx*xx &&
4,290✔
102
                return (rabs >> 8) % Bool ? -ziggurat_nor_r-xx : ziggurat_nor_r+xx
103
        end
256✔
104
    elseif (fi[idx] - fi[idx+1])*rand(rng) + fi[idx+1] < exp(-0.5*x*x)
228,142✔
105
        return x # return from the triangular area
124,478✔
106
    else
107
        return randn(rng)
103,664✔
108
    end
109
end
110

111
### complex randn
112

113
Base.@irrational SQRT_HALF 0.7071067811865475244008  sqrt(big(0.5))
114

115
randn(rng::AbstractRNG, ::Type{Complex{T}}) where {T<:AbstractFloat} =
148,358✔
116
    Complex{T}(SQRT_HALF * randn(rng, T), SQRT_HALF * randn(rng, T))
117

118

119
### fallback randn for float types defining rand:
120
function randn(rng::AbstractRNG, ::Type{T}) where {T<:AbstractFloat}
1✔
121
    # Marsaglia polar variant of Box–Muller transform:
122
    while true
1✔
123
        x, y = 2rand(rng, T)-1, 2rand(rng, T)-1
1✔
UNCOV
124
        0 < (s = x^2 + y^2) < 1 && return x * sqrt(-2log(s)/s)
×
UNCOV
125
    end
×
126
end
127

128
## randexp
129

130
"""
131
    randexp([rng=default_rng()], [T=Float64], [dims...])
132

133
Generate a random number of type `T` according to the
134
exponential distribution with scale 1.
135
Optionally generate an array of such random numbers.
136
The `Base` module currently provides an implementation for the types
137
[`Float16`](@ref), [`Float32`](@ref), and [`Float64`](@ref) (the default).
138

139
# Examples
140
```jldoctest
141
julia> rng = Xoshiro(123);
142

143
julia> randexp(rng, Float32)
144
1.1757717f0
145

146
julia> randexp(rng, 3, 3)
147
3×3 Matrix{Float64}:
148
 1.37766  0.456653  0.236418
149
 3.40007  0.229917  0.0684921
150
 0.48096  0.577481  0.71835
151
```
152
"""
153
randexp(rng::AbstractRNG=default_rng()) = _randexp(rng, rand(rng, UInt52Raw()))
119,327✔
154

155
function _randexp(rng::AbstractRNG, ri::UInt64)
119,327✔
156
    @inbounds begin
119,327✔
157
        ri &= 0x000fffffffffffff
119,327✔
158
        idx = ri & 0xFF
119,327✔
159
        x = ri*we[idx+1]
119,327✔
160
        ri < ke[idx+1] && return x # 98.9% of the time we return here 1st try
119,327✔
161
        return randexp_unlikely(rng, idx, x)
2,498✔
162
    end
163
end
164

165
@noinline function randexp_unlikely(rng, idx, x)
2,498✔
166
    @inbounds if idx == 0
2,498✔
167
        return ziggurat_exp_r - log1p(-rand(rng))
66✔
168
    elseif (fe[idx] - fe[idx+1])*rand(rng) + fe[idx+1] < exp(-x)
2,432✔
169
        return x # return from the triangular area
1,062✔
170
    else
171
        return randexp(rng)
1,370✔
172
    end
173
end
174

175
### fallback randexp for float types defining rand:
UNCOV
176
randexp(rng::AbstractRNG, ::Type{T}) where {T<:AbstractFloat} =
×
177
    -log1p(-rand(rng, T))
178

179
## arrays & other scalar methods
180

181
"""
182
    randn!([rng=default_rng()], A::AbstractArray) -> A
183

184
Fill the array `A` with normally-distributed (mean 0, standard deviation 1) random numbers.
185
Also see the [`rand`](@ref) function.
186

187
# Examples
188
```jldoctest
189
julia> randn!(Xoshiro(123), zeros(5))
190
5-element Vector{Float64}:
191
 -0.6457306721039767
192
 -1.4632513788889214
193
 -1.6236037455860806
194
 -0.21766510678354617
195
  0.4922456865251828
196
```
197
"""
198
function randn! end
199

200
"""
201
    randexp!([rng=default_rng()], A::AbstractArray) -> A
202

203
Fill the array `A` with random numbers following the exponential distribution
204
(with scale 1).
205

206
# Examples
207
```jldoctest
208
julia> randexp!(Xoshiro(123), zeros(5))
209
5-element Vector{Float64}:
210
 1.1757716836348473
211
 1.758884569451514
212
 1.0083623637301151
213
 0.3510644315565272
214
 0.6348266443720407
215
```
216
"""
217
function randexp! end
218

219
for randfun in [:randn, :randexp]
220
    randfun! = Symbol(randfun, :!)
221
    _randfun = Symbol(:_, randfun)
222
    @eval begin
223
        # scalars
224
        $randfun(rng::AbstractRNG, T::BitFloatType) = convert(T, $randfun(rng))
10,974,979✔
225
        $randfun(::Type{T}) where {T} = $randfun(default_rng(), T)
327,732✔
226

227
        # filling arrays
228
        function $randfun!(rng::AbstractRNG, A::AbstractArray{T}) where T
3✔
229
            for i in eachindex(A)
529✔
230
                @inbounds A[i] = $randfun(rng, T)
10,168,994✔
231
            end
20,337,493✔
232
            A
527✔
233
        end
234

235
        # optimization for MersenneTwister, which randomizes natively Array{Float64}
236
        function $randfun!(rng::MersenneTwister, A::Array{Float64})
2✔
237
            if length(A) < 13
2✔
UNCOV
238
                for i in eachindex(A)
×
UNCOV
239
                    @inbounds A[i] = $randfun(rng, Float64)
×
UNCOV
240
                end
×
241
            else
242
                rand!(rng, A, CloseOpen12())
2✔
243
                for i in eachindex(A)
2✔
244
                    @inbounds A[i] = $_randfun(rng, reinterpret(UInt64, A[i]))
190✔
245
                end
190✔
246
            end
247
            A
2✔
248
        end
249

250
        # optimization for Xoshiro, which randomizes natively Array{UInt64}
251
        function $randfun!(rng::Union{Xoshiro, TaskLocalRNG}, A::Array{Float64})
3,978✔
252
            if length(A) < 7
3,978✔
253
                for i in eachindex(A)
596✔
254
                    @inbounds A[i] = $randfun(rng, Float64)
2,215✔
255
                end
3,871✔
256
            else
257
                GC.@preserve A rand!(rng, UnsafeView{UInt64}(pointer(A), length(A)))
3,382✔
258

259
                for i in eachindex(A)
3,382✔
260
                    @inbounds A[i] = $_randfun(rng, reinterpret(UInt64, A[i]) >>> 12)
4,527,872✔
261
                end
4,527,872✔
262
            end
263
            A
3,978✔
264
        end
265

266
        $randfun!(A::AbstractArray) = $randfun!(default_rng(), A)
1✔
267

268
        # generating arrays
269
        $randfun(rng::AbstractRNG, ::Type{T}, dims::Dims                     ) where {T} = $randfun!(rng, Array{T}(undef, dims))
36✔
270
        # Note that this method explicitly does not define $randfun(rng, T),
271
        # in order to prevent an infinite recursion.
272
        $randfun(rng::AbstractRNG, ::Type{T}, dim1::Integer, dims::Integer...) where {T} = $randfun!(rng, Array{T}(undef, dim1, dims...))
10,020,605✔
UNCOV
273
        $randfun(                  ::Type{T}, dims::Dims                     ) where {T} = $randfun(default_rng(), T, dims)
×
274
        $randfun(                  ::Type{T}, dims::Integer...               ) where {T} = $randfun(default_rng(), T, dims...)
10,000,709✔
275
        $randfun(rng::AbstractRNG,            dims::Dims                     )           = $randfun(rng, Float64, dims)
×
276
        $randfun(rng::AbstractRNG,            dims::Integer...               )           = $randfun(rng, Float64, dims...)
308✔
277
        $randfun(                             dims::Dims                     )           = $randfun(default_rng(), Float64, dims)
36✔
278
        $randfun(                             dims::Integer...               )           = $randfun(default_rng(), Float64, dims...)
3,913✔
279
    end
280
end
281

282
## Tables for normal variates
283

284
const ki =
285
    UInt64[0x0007799ec012f7b2,0x0000000000000000,0x0006045f4c7de363,0x0006d1aa7d5ec0a5,
286
           0x000728fb3f60f777,0x0007592af4e9fbc0,0x000777a5c0bf655d,0x00078ca3857d2256,
287
           0x00079bf6b0ffe58b,0x0007a7a34ab092ad,0x0007b0d2f20dd1cb,0x0007b83d3aa9cb52,
288
           0x0007be597614224d,0x0007c3788631abe9,0x0007c7d32bc192ee,0x0007cb9263a6e86d,
289
           0x0007ced483edfa84,0x0007d1b07ac0fd39,0x0007d437ef2da5fc,0x0007d678b069aa6e,
290
           0x0007d87db38c5c87,0x0007da4fc6a9ba62,0x0007dbf611b37f3b,0x0007dd7674d0f286,
291
           0x0007ded5ce8205f6,0x0007e018307fb62b,0x0007e141081bd124,0x0007e2533d712de8,
292
           0x0007e3514bbd7718,0x0007e43d54944b52,0x0007e5192f25ef42,0x0007e5e67481118d,
293
           0x0007e6a6897c1ce2,0x0007e75aa6c7f64c,0x0007e803df8ee498,0x0007e8a326eb6272,
294
           0x0007e93954717a28,0x0007e9c727f8648f,0x0007ea4d4cc85a3c,0x0007eacc5c4907a9,
295
           0x0007eb44e0474cf6,0x0007ebb754e47419,0x0007ec242a3d8474,0x0007ec8bc5d69645,
296
           0x0007ecee83d3d6e9,0x0007ed4cb8082f45,0x0007eda6aee0170f,0x0007edfcae2dfe68,
297
           0x0007ee4ef5dccd3e,0x0007ee9dc08c394e,0x0007eee9441a17c7,0x0007ef31b21b4fb1,
298
           0x0007ef773846a8a7,0x0007efba00d35a17,0x0007effa32ccf69f,0x0007f037f25e1278,
299
           0x0007f0736112d12c,0x0007f0ac9e145c25,0x0007f0e3c65e1fcc,0x0007f118f4ed8e54,
300
           0x0007f14c42ed0dc8,0x0007f17dc7daa0c3,0x0007f1ad99aac6a5,0x0007f1dbcce80015,
301
           0x0007f20874cf56bf,0x0007f233a36a3b9a,0x0007f25d69a604ad,0x0007f285d7694a92,
302
           0x0007f2acfba75e3b,0x0007f2d2e4720909,0x0007f2f79f09c344,0x0007f31b37ec883b,
303
           0x0007f33dbae36abc,0x0007f35f330f08d5,0x0007f37faaf2fa79,0x0007f39f2c805380,
304
           0x0007f3bdc11f4f1c,0x0007f3db71b83850,0x0007f3f846bba121,0x0007f4144829f846,
305
           0x0007f42f7d9a8b9d,0x0007f449ee420432,0x0007f463a0f8675e,0x0007f47c9c3ea77b,
306
           0x0007f494e643cd8e,0x0007f4ac84e9c475,0x0007f4c37dc9cd50,0x0007f4d9d638a432,
307
           0x0007f4ef934a5b6a,0x0007f504b9d5f33d,0x0007f5194e78b352,0x0007f52d55994a96,
308
           0x0007f540d36aba0c,0x0007f553cbef0e77,0x0007f56642f9ec8f,0x0007f5783c32f31e,
309
           0x0007f589bb17f609,0x0007f59ac2ff1525,0x0007f5ab5718b15a,0x0007f5bb7a71427c,
310
           0x0007f5cb2ff31009,0x0007f5da7a67cebe,0x0007f5e95c7a24e7,0x0007f5f7d8b7171e,
311
           0x0007f605f18f5ef4,0x0007f613a958ad0a,0x0007f621024ed7e9,0x0007f62dfe94f8cb,
312
           0x0007f63aa036777a,0x0007f646e928065a,0x0007f652db488f88,0x0007f65e786213ff,
313
           0x0007f669c22a7d8a,0x0007f674ba446459,0x0007f67f623fc8db,0x0007f689bb9ac294,
314
           0x0007f693c7c22481,0x0007f69d881217a6,0x0007f6a6fdd6ac36,0x0007f6b02a4c61ee,
315
           0x0007f6b90ea0a7f4,0x0007f6c1abf254c0,0x0007f6ca03521664,0x0007f6d215c2db82,
316
           0x0007f6d9e43a3559,0x0007f6e16fa0b329,0x0007f6e8b8d23729,0x0007f6efc09e4569,
317
           0x0007f6f687c84cbf,0x0007f6fd0f07ea09,0x0007f703570925e2,0x0007f709606cad03,
318
           0x0007f70f2bc8036f,0x0007f714b9a5b292,0x0007f71a0a85725d,0x0007f71f1edc4d9e,
319
           0x0007f723f714c179,0x0007f728938ed843,0x0007f72cf4a03fa0,0x0007f7311a945a16,
320
           0x0007f73505ac4bf8,0x0007f738b61f03bd,0x0007f73c2c193dc0,0x0007f73f67bd835c,
321
           0x0007f74269242559,0x0007f745305b31a1,0x0007f747bd666428,0x0007f74a103f12ed,
322
           0x0007f74c28d414f5,0x0007f74e0709a42d,0x0007f74faab939f9,0x0007f75113b16657,
323
           0x0007f75241b5a155,0x0007f753347e16b8,0x0007f753ebb76b7c,0x0007f75467027d05,
324
           0x0007f754a5f4199d,0x0007f754a814b207,0x0007f7546ce003ae,0x0007f753f3c4bb29,
325
           0x0007f7533c240e92,0x0007f75245514f41,0x0007f7510e91726c,0x0007f74f971a9012,
326
           0x0007f74dde135797,0x0007f74be2927971,0x0007f749a39e051c,0x0007f747202aba8a,
327
           0x0007f744571b4e3c,0x0007f741473f9efe,0x0007f73def53dc43,0x0007f73a4dff9bff,
328
           0x0007f73661d4deaf,0x0007f732294f003f,0x0007f72da2d19444,0x0007f728cca72bda,
329
           0x0007f723a5000367,0x0007f71e29f09627,0x0007f7185970156b,0x0007f7123156c102,
330
           0x0007f70baf5c1e2c,0x0007f704d1150a23,0x0007f6fd93f1a4e5,0x0007f6f5f53b10b6,
331
           0x0007f6edf211023e,0x0007f6e587671ce9,0x0007f6dcb2021679,0x0007f6d36e749c64,
332
           0x0007f6c9b91bf4c6,0x0007f6bf8e1c541b,0x0007f6b4e95ce015,0x0007f6a9c68356ff,
333
           0x0007f69e20ef5211,0x0007f691f3b517eb,0x0007f6853997f321,0x0007f677ed03ff19,
334
           0x0007f66a08075bdc,0x0007f65b844ab75a,0x0007f64c5b091860,0x0007f63c8506d4bc,
335
           0x0007f62bfa8798fe,0x0007f61ab34364b0,0x0007f608a65a599a,0x0007f5f5ca4737e8,
336
           0x0007f5e214d05b48,0x0007f5cd7af7066e,0x0007f5b7f0e4c2a1,0x0007f5a169d68fcf,
337
           0x0007f589d80596a5,0x0007f5712c8d0174,0x0007f557574c912b,0x0007f53c46c77193,
338
           0x0007f51fe7feb9f2,0x0007f5022646ecfb,0x0007f4e2eb17ab1d,0x0007f4c21dd4a3d1,
339
           0x0007f49fa38ea394,0x0007f47b5ebb62eb,0x0007f4552ee27473,0x0007f42cf03d58f5,
340
           0x0007f4027b48549f,0x0007f3d5a44119df,0x0007f3a63a8fb552,0x0007f37408155100,
341
           0x0007f33ed05b55ec,0x0007f3064f9c183e,0x0007f2ca399c7ba1,0x0007f28a384bb940,
342
           0x0007f245ea1b7a2b,0x0007f1fcdffe8f1b,0x0007f1ae9af758cd,0x0007f15a8917f27e,
343
           0x0007f10001ccaaab,0x0007f09e413c418a,0x0007f034627733d7,0x0007efc15815b8d5,
344
           0x0007ef43e2bf7f55,0x0007eeba84e31dfe,0x0007ee237294df89,0x0007ed7c7c170141,
345
           0x0007ecc2f0d95d3a,0x0007ebf377a46782,0x0007eb09d6deb285,0x0007ea00a4f17808,
346
           0x0007e8d0d3da63d6,0x0007e771023b0fcf,0x0007e5d46c2f08d8,0x0007e3e937669691,
347
           0x0007e195978f1176,0x0007deb2c0e05c1c,0x0007db0362002a19,0x0007d6202c151439,
348
           0x0007cf4b8f00a2cb,0x0007c4fd24520efd,0x0007b362fbf81816,0x00078d2d25998e24]
349
const wi =
350
    [1.7367254121602630e-15,9.5586603514556339e-17,1.2708704834810623e-16,
351
     1.4909740962495474e-16,1.6658733631586268e-16,1.8136120810119029e-16,
352
     1.9429720153135588e-16,2.0589500628482093e-16,2.1646860576895422e-16,
353
     2.2622940392218116e-16,2.3532718914045892e-16,2.4387234557428771e-16,
354
     2.5194879829274225e-16,2.5962199772528103e-16,2.6694407473648285e-16,
355
     2.7395729685142446e-16,2.8069646002484804e-16,2.8719058904113930e-16,
356
     2.9346417484728883e-16,2.9953809336782113e-16,3.0543030007192440e-16,
357
     3.1115636338921572e-16,3.1672988018581815e-16,3.2216280350549905e-16,
358
     3.2746570407939751e-16,3.3264798116841710e-16,3.3771803417353232e-16,
359
     3.4268340353119356e-16,3.4755088731729758e-16,3.5232663846002031e-16,
360
     3.5701624633953494e-16,3.6162480571598339e-16,3.6615697529653540e-16,
361
     3.7061702777236077e-16,3.7500889278747798e-16,3.7933619401549554e-16,
362
     3.8360228129677279e-16,3.8781025861250247e-16,3.9196300853257678e-16,
363
     3.9606321366256378e-16,4.0011337552546690e-16,4.0411583124143332e-16,
364
     4.0807276830960448e-16,4.1198623774807442e-16,4.1585816580828064e-16,
365
     4.1969036444740733e-16,4.2348454071520708e-16,4.2724230518899761e-16,
366
     4.3096517957162941e-16,4.3465460355128760e-16,4.3831194100854571e-16,
367
     4.4193848564470665e-16,4.4553546609579137e-16,4.4910405058828750e-16,
368
     4.5264535118571397e-16,4.5616042766900381e-16,4.5965029108849407e-16,
369
     4.6311590702081647e-16,4.6655819856008752e-16,4.6997804906941950e-16,
370
     4.7337630471583237e-16,4.7675377680908526e-16,4.8011124396270155e-16,
371
     4.8344945409350080e-16,4.8676912627422087e-16,4.9007095245229938e-16,
372
     4.9335559904654139e-16,4.9662370843221783e-16,4.9987590032409088e-16,
373
     5.0311277306593187e-16,5.0633490483427195e-16,5.0954285476338923e-16,
374
     5.1273716399787966e-16,5.1591835667857364e-16,5.1908694086703434e-16,
375
     5.2224340941340417e-16,5.2538824077194543e-16,5.2852189976823820e-16,
376
     5.3164483832166176e-16,5.3475749612647295e-16,5.3786030129452348e-16,
377
     5.4095367096239933e-16,5.4403801186554671e-16,5.4711372088173611e-16,
378
     5.5018118554603362e-16,5.5324078453927836e-16,5.5629288815190902e-16,
379
     5.5933785872484621e-16,5.6237605106900435e-16,5.6540781286489604e-16,
380
     5.6843348504368141e-16,5.7145340215092040e-16,5.7446789269419609e-16,
381
     5.7747727947569648e-16,5.8048187991076857e-16,5.8348200633338921e-16,
382
     5.8647796628943653e-16,5.8947006281858718e-16,5.9245859472561339e-16,
383
     5.9544385684180598e-16,5.9842614027720281e-16,6.0140573266426640e-16,
384
     6.0438291839361250e-16,6.0735797884236057e-16,6.1033119259564394e-16,
385
     6.1330283566179110e-16,6.1627318168165963e-16,6.1924250213258470e-16,
386
     6.2221106652737879e-16,6.2517914260879998e-16,6.2814699653988953e-16,
387
     6.3111489309056042e-16,6.3408309582080600e-16,6.3705186726088149e-16,
388
     6.4002146908880247e-16,6.4299216230548961e-16,6.4596420740788321e-16,
389
     6.4893786456033965e-16,6.5191339376461587e-16,6.5489105502874154e-16,
390
     6.5787110853507413e-16,6.6085381480782587e-16,6.6383943488035057e-16,
391
     6.6682823046247459e-16,6.6982046410815579e-16,6.7281639938375311e-16,
392
     6.7581630103719006e-16,6.7882043516829803e-16,6.8182906940062540e-16,
393
     6.8484247305500383e-16,6.8786091732516637e-16,6.9088467545571690e-16,
394
     6.9391402292275690e-16,6.9694923761748294e-16,6.9999060003307640e-16,
395
     7.0303839345521508e-16,7.0609290415654822e-16,7.0915442159548734e-16,
396
     7.1222323861967788e-16,7.1529965167453030e-16,7.1838396101720629e-16,
397
     7.2147647093647067e-16,7.2457748997883870e-16,7.2768733118146927e-16,
398
     7.3080631231227429e-16,7.3393475611774048e-16,7.3707299057898310e-16,
399
     7.4022134917657997e-16,7.4338017116476479e-16,7.4654980185558890e-16,
400
     7.4973059291369793e-16,7.5292290266240584e-16,7.5612709640179217e-16,
401
     7.5934354673958895e-16,7.6257263393567558e-16,7.6581474626104873e-16,
402
     7.6907028037219191e-16,7.7233964170182985e-16,7.7562324486711744e-16,
403
     7.7892151409638524e-16,7.8223488367564108e-16,7.8556379841610841e-16,
404
     7.8890871414417552e-16,7.9227009821522709e-16,7.9564843005293662e-16,
405
     7.9904420171571300e-16,8.0245791849212591e-16,8.0589009952726568e-16,
406
     8.0934127848215009e-16,8.1281200422845008e-16,8.1630284158098775e-16,
407
     8.1981437207065329e-16,8.2334719476060504e-16,8.2690192710884700e-16,
408
     8.3047920588053737e-16,8.3407968811366288e-16,8.3770405214202216e-16,
409
     8.4135299867980282e-16,8.4502725197240968e-16,8.4872756101861549e-16,
410
     8.5245470086955962e-16,8.5620947401062333e-16,8.5999271183276646e-16,
411
     8.6380527620052589e-16,8.6764806112455816e-16,8.7152199454736980e-16,
412
     8.7542804025171749e-16,8.7936719990210427e-16,8.8334051523084080e-16,
413
     8.8734907038131345e-16,8.9139399442240861e-16,8.9547646404950677e-16,
414
     8.9959770648910994e-16,9.0375900262601175e-16,9.0796169037400680e-16,
415
     9.1220716831348461e-16,9.1649689962191353e-16,9.2083241632623076e-16,
416
     9.2521532390956933e-16,9.2964730630864167e-16,9.3413013134252651e-16,
417
     9.3866565661866598e-16,9.4325583596767065e-16,9.4790272646517382e-16,
418
     9.5260849610662787e-16,9.5737543220974496e-16,9.6220595062948384e-16,
419
     9.6710260588230542e-16,9.7206810229016259e-16,9.7710530627072088e-16,
420
     9.8221725991905411e-16,9.8740719604806711e-16,9.9267855488079765e-16,
421
     9.9803500261836449e-16,1.0034804521436181e-15,1.0090190861637457e-15,
422
     1.0146553831467086e-15,1.0203941464683124e-15,1.0262405372613567e-15,
423
     1.0322001115486456e-15,1.0382788623515399e-15,1.0444832676000471e-15,
424
     1.0508203448355195e-15,1.0572977139009890e-15,1.0639236690676801e-15,
425
     1.0707072623632994e-15,1.0776584002668106e-15,1.0847879564403425e-15,
426
     1.0921079038149563e-15,1.0996314701785628e-15,1.1073733224935752e-15,
427
     1.1153497865853155e-15,1.1235791107110833e-15,1.1320817840164846e-15,
428
     1.1408809242582780e-15,1.1500027537839792e-15,1.1594771891449189e-15,
429
     1.1693385786910960e-15,1.1796266352955801e-15,1.1903876299282890e-15,
430
     1.2016759392543819e-15,1.2135560818666897e-15,1.2261054417450561e-15,
431
     1.2394179789163251e-15,1.2536093926602567e-15,1.2688244814255010e-15,
432
     1.2852479319096109e-15,1.3031206634689985e-15,1.3227655770195326e-15,
433
     1.3446300925011171e-15,1.3693606835128518e-15,1.3979436672775240e-15,
434
     1.4319989869661328e-15,1.4744848603597596e-15,1.5317872741611144e-15,
435
     1.6227698675312968e-15]
436
const fi =
437
    [1.0000000000000000e+00,9.7710170126767082e-01,9.5987909180010600e-01,
438
     9.4519895344229909e-01,9.3206007595922991e-01,9.1999150503934646e-01,
439
     9.0872644005213032e-01,8.9809592189834297e-01,8.8798466075583282e-01,
440
     8.7830965580891684e-01,8.6900868803685649e-01,8.6003362119633109e-01,
441
     8.5134625845867751e-01,8.4291565311220373e-01,8.3471629298688299e-01,
442
     8.2672683394622093e-01,8.1892919160370192e-01,8.1130787431265572e-01,
443
     8.0384948317096383e-01,7.9654233042295841e-01,7.8937614356602404e-01,
444
     7.8234183265480195e-01,7.7543130498118662e-01,7.6863731579848571e-01,
445
     7.6195334683679483e-01,7.5537350650709567e-01,7.4889244721915638e-01,
446
     7.4250529634015061e-01,7.3620759812686210e-01,7.2999526456147568e-01,
447
     7.2386453346862967e-01,7.1781193263072152e-01,7.1183424887824798e-01,
448
     7.0592850133275376e-01,7.0009191813651117e-01,6.9432191612611627e-01,
449
     6.8861608300467136e-01,6.8297216164499430e-01,6.7738803621877308e-01,
450
     6.7186171989708166e-01,6.6639134390874977e-01,6.6097514777666277e-01,
451
     6.5561147057969693e-01,6.5029874311081637e-01,6.4503548082082196e-01,
452
     6.3982027745305614e-01,6.3465179928762327e-01,6.2952877992483625e-01,
453
     6.2445001554702606e-01,6.1941436060583399e-01,6.1442072388891344e-01,
454
     6.0946806492577310e-01,6.0455539069746733e-01,5.9968175261912482e-01,
455
     5.9484624376798689e-01,5.9004799633282545e-01,5.8528617926337090e-01,
456
     5.8055999610079034e-01,5.7586868297235316e-01,5.7121150673525267e-01,
457
     5.6658776325616389e-01,5.6199677581452390e-01,5.5743789361876550e-01,
458
     5.5291049042583185e-01,5.4841396325526537e-01,5.4394773119002582e-01,
459
     5.3951123425695158e-01,5.3510393238045717e-01,5.3072530440366150e-01,
460
     5.2637484717168403e-01,5.2205207467232140e-01,5.1775651722975591e-01,
461
     5.1348772074732651e-01,5.0924524599574761e-01,5.0502866794346790e-01,
462
     5.0083757512614835e-01,4.9667156905248933e-01,4.9253026364386815e-01,
463
     4.8841328470545758e-01,4.8432026942668288e-01,4.8025086590904642e-01,
464
     4.7620473271950547e-01,4.7218153846772976e-01,4.6818096140569321e-01,
465
     4.6420268904817391e-01,4.6024641781284248e-01,4.5631185267871610e-01,
466
     4.5239870686184824e-01,4.4850670150720273e-01,4.4463556539573912e-01,
467
     4.4078503466580377e-01,4.3695485254798533e-01,4.3314476911265209e-01,
468
     4.2935454102944126e-01,4.2558393133802180e-01,4.2183270922949573e-01,
469
     4.1810064983784795e-01,4.1438753404089090e-01,4.1069314827018799e-01,
470
     4.0701728432947315e-01,4.0335973922111429e-01,3.9972031498019700e-01,
471
     3.9609881851583223e-01,3.9249506145931540e-01,3.8890886001878855e-01,
472
     3.8534003484007706e-01,3.8178841087339344e-01,3.7825381724561896e-01,
473
     3.7473608713789086e-01,3.7123505766823922e-01,3.6775056977903225e-01,
474
     3.6428246812900372e-01,3.6083060098964775e-01,3.5739482014578022e-01,
475
     3.5397498080007656e-01,3.5057094148140588e-01,3.4718256395679348e-01,
476
     3.4380971314685055e-01,3.4045225704452164e-01,3.3711006663700588e-01,
477
     3.3378301583071823e-01,3.3047098137916342e-01,3.2717384281360129e-01,
478
     3.2389148237639104e-01,3.2062378495690530e-01,3.1737063802991350e-01,
479
     3.1413193159633707e-01,3.1090755812628634e-01,3.0769741250429189e-01,
480
     3.0450139197664983e-01,3.0131939610080288e-01,2.9815132669668531e-01,
481
     2.9499708779996164e-01,2.9185658561709499e-01,2.8872972848218270e-01,
482
     2.8561642681550159e-01,2.8251659308370741e-01,2.7943014176163772e-01,
483
     2.7635698929566810e-01,2.7329705406857691e-01,2.7025025636587519e-01,
484
     2.6721651834356114e-01,2.6419576399726080e-01,2.6118791913272082e-01,
485
     2.5819291133761890e-01,2.5521066995466168e-01,2.5224112605594190e-01,
486
     2.4928421241852824e-01,2.4633986350126363e-01,2.4340801542275012e-01,
487
     2.4048860594050039e-01,2.3758157443123795e-01,2.3468686187232990e-01,
488
     2.3180441082433859e-01,2.2893416541468023e-01,2.2607607132238020e-01,
489
     2.2323007576391746e-01,2.2039612748015194e-01,2.1757417672433113e-01,
490
     2.1476417525117358e-01,2.1196607630703015e-01,2.0917983462112499e-01,
491
     2.0640540639788071e-01,2.0364274931033485e-01,2.0089182249465656e-01,
492
     1.9815258654577511e-01,1.9542500351413428e-01,1.9270903690358912e-01,
493
     1.9000465167046496e-01,1.8731181422380025e-01,1.8463049242679927e-01,
494
     1.8196065559952254e-01,1.7930227452284767e-01,1.7665532144373500e-01,
495
     1.7401977008183875e-01,1.7139559563750595e-01,1.6878277480121151e-01,
496
     1.6618128576448205e-01,1.6359110823236570e-01,1.6101222343751107e-01,
497
     1.5844461415592431e-01,1.5588826472447920e-01,1.5334316106026283e-01,
498
     1.5080929068184568e-01,1.4828664273257453e-01,1.4577520800599403e-01,
499
     1.4327497897351341e-01,1.4078594981444470e-01,1.3830811644855071e-01,
500
     1.3584147657125373e-01,1.3338602969166913e-01,1.3094177717364430e-01,
501
     1.2850872227999952e-01,1.2608687022018586e-01,1.2367622820159654e-01,
502
     1.2127680548479021e-01,1.1888861344290998e-01,1.1651166562561080e-01,
503
     1.1414597782783835e-01,1.1179156816383801e-01,1.0944845714681163e-01,
504
     1.0711666777468364e-01,1.0479622562248690e-01,1.0248715894193508e-01,
505
     1.0018949876880981e-01,9.7903279038862284e-02,9.5628536713008819e-02,
506
     9.3365311912690860e-02,9.1113648066373634e-02,8.8873592068275789e-02,
507
     8.6645194450557961e-02,8.4428509570353374e-02,8.2223595813202863e-02,
508
     8.0030515814663056e-02,7.7849336702096039e-02,7.5680130358927067e-02,
509
     7.3522973713981268e-02,7.1377949058890375e-02,6.9245144397006769e-02,
510
     6.7124653827788497e-02,6.5016577971242842e-02,6.2921024437758113e-02,
511
     6.0838108349539864e-02,5.8767952920933758e-02,5.6710690106202902e-02,
512
     5.4666461324888914e-02,5.2635418276792176e-02,5.0617723860947761e-02,
513
     4.8613553215868521e-02,4.6623094901930368e-02,4.4646552251294443e-02,
514
     4.2684144916474431e-02,4.0736110655940933e-02,3.8802707404526113e-02,
515
     3.6884215688567284e-02,3.4980941461716084e-02,3.3093219458578522e-02,
516
     3.1221417191920245e-02,2.9365939758133314e-02,2.7527235669603082e-02,
517
     2.5705804008548896e-02,2.3902203305795882e-02,2.2117062707308864e-02,
518
     2.0351096230044517e-02,1.8605121275724643e-02,1.6880083152543166e-02,
519
     1.5177088307935325e-02,1.3497450601739880e-02,1.1842757857907888e-02,
520
     1.0214971439701471e-02,8.6165827693987316e-03,7.0508754713732268e-03,
521
     5.5224032992509968e-03,4.0379725933630305e-03,2.6090727461021627e-03,
522
     1.2602859304985975e-03]
523

524
## Tables for exponential variates
525

526
const ke =
527
    UInt64[0x000e290a13924be3,0x0000000000000000,0x0009beadebce18bf,0x000c377ac71f9e08,
528
           0x000d4ddb99075857,0x000de893fb8ca23e,0x000e4a8e87c4328d,0x000e8dff16ae1cb9,
529
           0x000ebf2deab58c59,0x000ee49a6e8b9638,0x000f0204efd64ee4,0x000f19bdb8ea3c1b,
530
           0x000f2d458bbe5bd1,0x000f3da104b78236,0x000f4b86d784571f,0x000f577ad8a7784f,
531
           0x000f61de83da32ab,0x000f6afb7843cce7,0x000f730a57372b44,0x000f7a37651b0e68,
532
           0x000f80a5bb6eea52,0x000f867189d3cb5b,0x000f8bb1b4f8fbbd,0x000f9079062292b8,
533
           0x000f94d70ca8d43a,0x000f98d8c7dcaa99,0x000f9c8928abe083,0x000f9ff175b734a6,
534
           0x000fa319996bc47d,0x000fa6085f8e9d07,0x000fa8c3a62e1991,0x000fab5084e1f660,
535
           0x000fadb36c84cccb,0x000faff041086846,0x000fb20a6ea22bb9,0x000fb404fb42cb3c,
536
           0x000fb5e295158173,0x000fb7a59e99727a,0x000fb95038c8789d,0x000fbae44ba684eb,
537
           0x000fbc638d822e60,0x000fbdcf89209ffa,0x000fbf29a303cfc5,0x000fc0731df1089c,
538
           0x000fc1ad1ed6c8b1,0x000fc2d8b02b5c89,0x000fc3f6c4d92131,0x000fc5083ac9ba7d,
539
           0x000fc60ddd1e9cd6,0x000fc7086622e825,0x000fc7f881009f0b,0x000fc8decb41ac70,
540
           0x000fc9bbd623d7ec,0x000fca9027c5b26d,0x000fcb5c3c319c49,0x000fcc20864b4449,
541
           0x000fccdd70a35d40,0x000fcd935e34bf80,0x000fce42ab0db8bd,0x000fceebace7ec01,
542
           0x000fcf8eb3b0d0e7,0x000fd02c0a049b60,0x000fd0c3f59d199c,0x000fd156b7b5e27e,
543
           0x000fd1e48d670341,0x000fd26daff73551,0x000fd2f2552684be,0x000fd372af7233c1,
544
           0x000fd3eeee528f62,0x000fd4673e73543a,0x000fd4dbc9e72ff7,0x000fd54cb856dc2c,
545
           0x000fd5ba2f2c4119,0x000fd62451ba02c2,0x000fd68b415fcff4,0x000fd6ef1dabc160,
546
           0x000fd75004790eb6,0x000fd7ae120c583f,0x000fd809612dbd09,0x000fd8620b40effa,
547
           0x000fd8b8285b78fd,0x000fd90bcf594b1d,0x000fd95d15efd425,0x000fd9ac10bfa70c,
548
           0x000fd9f8d364df06,0x000fda437086566b,0x000fda8bf9e3c9fe,0x000fdad28062fed5,
549
           0x000fdb17141bff2c,0x000fdb59c4648085,0x000fdb9a9fda83cc,0x000fdbd9b46e3ed4,
550
           0x000fdc170f6b5d04,0x000fdc52bd81a3fb,0x000fdc8ccacd07ba,0x000fdcc542dd3902,
551
           0x000fdcfc30bcb793,0x000fdd319ef77143,0x000fdd6597a0f60b,0x000fdd98245a48a2,
552
           0x000fddc94e575271,0x000fddf91e64014f,0x000fde279ce914ca,0x000fde54d1f0a06a,
553
           0x000fde80c52a47cf,0x000fdeab7def394e,0x000fded50345eb35,0x000fdefd5be59fa0,
554
           0x000fdf248e39b26f,0x000fdf4aa064b4af,0x000fdf6f98435894,0x000fdf937b6f30ba,
555
           0x000fdfb64f414571,0x000fdfd818d48262,0x000fdff8dd07fed8,0x000fe018a08122c4,
556
           0x000fe03767adaa59,0x000fe05536c58a13,0x000fe07211ccb4c5,0x000fe08dfc94c532,
557
           0x000fe0a8fabe8ca1,0x000fe0c30fbb87a5,0x000fe0dc3ecf3a5a,0x000fe0f48b107521,
558
           0x000fe10bf76a82ef,0x000fe122869e41ff,0x000fe1383b4327e1,0x000fe14d17c83187,
559
           0x000fe1611e74c023,0x000fe1745169635a,0x000fe186b2a09176,0x000fe19843ef4e07,
560
           0x000fe1a90705bf63,0x000fe1b8fd6fb37c,0x000fe1c828951443,0x000fe1d689ba4bfd,
561
           0x000fe1e4220099a4,0x000fe1f0f26655a0,0x000fe1fcfbc726d4,0x000fe2083edc2830,
562
           0x000fe212bc3bfeb4,0x000fe21c745adfe3,0x000fe225678a8895,0x000fe22d95fa23f4,
563
           0x000fe234ffb62282,0x000fe23ba4a800d9,0x000fe2418495fddc,0x000fe2469f22bffb,
564
           0x000fe24af3cce90d,0x000fe24e81ee9858,0x000fe25148bcda19,0x000fe253474703fe,
565
           0x000fe2547c75fdc6,0x000fe254e70b754f,0x000fe25485a0fd1a,0x000fe25356a71450,
566
           0x000fe2515864173a,0x000fe24e88f316f1,0x000fe24ae64296fa,0x000fe2466e132f60,
567
           0x000fe2411df611bd,0x000fe23af34b6f73,0x000fe233eb40bf41,0x000fe22c02cee01b,
568
           0x000fe22336b81710,0x000fe2198385e5cc,0x000fe20ee586b707,0x000fe20358cb5dfb,
569
           0x000fe1f6d92465b1,0x000fe1e9621f2c9e,0x000fe1daef02c8da,0x000fe1cb7accb0a6,
570
           0x000fe1bb002d22c9,0x000fe1a9798349b8,0x000fe196e0d9140c,0x000fe1832fdebc44,
571
           0x000fe16e5fe5f931,0x000fe15869dccfcf,0x000fe1414647fe78,0x000fe128ed3cf8b2,
572
           0x000fe10f565b69cf,0x000fe0f478c633ab,0x000fe0d84b1bdd9e,0x000fe0bac36e6688,
573
           0x000fe09bd73a6b5b,0x000fe07b7b5d920a,0x000fe059a40c26d2,0x000fe03644c5d7f8,
574
           0x000fe011504979b2,0x000fdfeab887b95c,0x000fdfc26e94a447,0x000fdf986297e305,
575
           0x000fdf6c83bb8663,0x000fdf3ec0193eed,0x000fdf0f04a5d30a,0x000fdedd3d1aa204,
576
           0x000fdea953dcfc13,0x000fde7331e3100d,0x000fde3abe9626f2,0x000fddffdfb1dbd5,
577
           0x000fddc2791ff351,0x000fdd826cd068c6,0x000fdd3f9a8d3856,0x000fdcf9dfc95b0c,
578
           0x000fdcb1176a55fe,0x000fdc65198ba50b,0x000fdc15bb3b2daa,0x000fdbc2ce2dc4ae,
579
           0x000fdb6c206aaaca,0x000fdb117becb4a1,0x000fdab2a6379bf0,0x000fda4f5fdfb4e9,
580
           0x000fd9e76401f3a3,0x000fd97a67a9ce1f,0x000fd90819221429,0x000fd8901f2d4b02,
581
           0x000fd812182170e1,0x000fd78d98e23cd3,0x000fd7022bb3f082,0x000fd66f4edf96b9,
582
           0x000fd5d473200305,0x000fd530f9ccff94,0x000fd48432b7b351,0x000fd3cd59a8469e,
583
           0x000fd30b9368f90a,0x000fd23dea45f500,0x000fd16349e2e04a,0x000fd07a7a3ef98a,
584
           0x000fcf8219b5df05,0x000fce7895bcfcde,0x000fcd5c220ad5e2,0x000fcc2aadbc17dc,
585
           0x000fcae1d5e81fbc,0x000fc97ed4e778f9,0x000fc7fe6d4d720e,0x000fc65ccf39c2fc,
586
           0x000fc4957623cb03,0x000fc2a2fc826dc7,0x000fc07ee19b01cd,0x000fbe213c1cf493,
587
           0x000fbb8051ac1566,0x000fb890078d120e,0x000fb5411a5b9a95,0x000fb18000547133,
588
           0x000fad334827f1e2,0x000fa839276708b9,0x000fa263b32e37ed,0x000f9b72d1c52cd1,
589
           0x000f930a1a281a05,0x000f889f023d820a,0x000f7b577d2be5f3,0x000f69c650c40a8f,
590
           0x000f51530f0916d8,0x000f2cb0e3c5933e,0x000eeefb15d605d8,0x000e6da6ecf27460]
591

592
const we =
593
    [1.9311480126418366e-15,1.4178028487910829e-17,2.3278824993382448e-17,
594
     3.0487830247064320e-17,3.6665697714474878e-17,4.2179302189289733e-17,
595
     4.7222561556862764e-17,5.1911915446217879e-17,5.6323471083955047e-17,
596
     6.0510082606427647e-17,6.4510165096727506e-17,6.8352646803700541e-17,
597
     7.2059939574689050e-17,7.5649815537392981e-17,7.9136643961951065e-17,
598
     8.2532235563518929e-17,8.5846436168850513e-17,8.9087554865647428e-17,
599
     9.2262679629663719e-17,9.5377914505292719e-17,9.8438560874559257e-17,
600
     1.0144925809006294e-16,1.0441409405585343e-16,1.0733669323436384e-16,
601
     1.1022028745670189e-16,1.1306777346479334e-16,1.1588176009705533e-16,
602
     1.1866460730417886e-16,1.2141845865694359e-16,1.2414526862326387e-16,
603
     1.2684682560606153e-16,1.2952477151912284e-16,1.3218061851538810e-16,
604
     1.3481576335745444e-16,1.3743149982367625e-16,1.4002902946807859e-16,
605
     1.4260947099321287e-16,1.4517386844829297e-16,1.4772319842763584e-16,
606
     1.5025837641447456e-16,1.5278026239101652e-16,1.5528966581595696e-16,
607
     1.5778735005459581e-16,1.6027403633350909e-16,1.6275040728083524e-16,
608
     1.6521711010420076e-16,1.6767475945078279e-16,1.7012393998770646e-16,
609
     1.7256520873568226e-16,1.7499909718432365e-16,1.7742611321380505e-16,
610
     1.7984674284430714e-16,1.8226145183195818e-16,1.8467068712763576e-16,
611
     1.8707487821298258e-16,1.8947443832625899e-16,1.9186976558915995e-16,
612
     1.9426124404443042e-16,1.9664924461299023e-16,1.9903412597830144e-16,
613
     2.0141623540485899e-16,2.0379590949693882e-16,2.0617347490308439e-16,
614
     2.0854924897123771e-16,2.1092354035891528e-16,2.1329664960238294e-16,
615
     2.1566886964838970e-16,2.1804048635167009e-16,2.2041177894111562e-16,
616
     2.2278302045723950e-16,2.2515447816331350e-16,2.2752641393233694e-16,
617
     2.2989908461180186e-16,2.3227274236804366e-16,2.3464763501180916e-16,
618
     2.3702400630653389e-16,2.3940209626069303e-16,2.4178214140547710e-16,
619
     2.4416437505894123e-16,2.4654902757768304e-16,2.4893632659702250e-16,
620
     2.5132649726057970e-16,2.5371976244007951e-16,2.5611634294614988e-16,
621
     2.5851645773082391e-16,2.6092032408240577e-16,2.6332815781331452e-16,
622
     2.6574017344147618e-16,2.6815658436579989e-16,2.7057760303623509e-16,
623
     2.7300344111887955e-16,2.7543430965657619e-16,2.7787041922541278e-16,
624
     2.8031198008751431e-16,2.8275920234049704e-16,2.8521229606393309e-16,
625
     2.8767147146315804e-16,2.9013693901073754e-16,2.9260890958589514e-16,
626
     2.9508759461219033e-16,2.9757320619372521e-16,3.0006595725014739e-16,
627
     3.0256606165070789e-16,3.0507373434762511e-16,3.0758919150899939e-16,
628
     3.1011265065151543e-16,3.1264433077316750e-16,3.1518445248623523e-16,
629
     3.1773323815073683e-16,3.2029091200858335e-16,3.2285770031865573e-16,
630
     3.2543383149302610e-16,3.2801953623454359e-16,3.3061504767600738e-16,
631
     3.3322060152114841e-16,3.3583643618764577e-16,3.3846279295240445e-16,
632
     3.4109991609932597e-16,3.4374805306980633e-16,3.4640745461620167e-16,
633
     3.4907837495850680e-16,3.5176107194449828e-16,3.5445580721360130e-16,
634
     3.5716284636474652e-16,3.5988245912849274e-16,3.6261491954370031e-16,
635
     3.6536050613905045e-16,3.6811950211971757e-16,3.7089219555951389e-16,
636
     3.7367887959883854e-16,3.7647985264877841e-16,3.7929541860172334e-16,
637
     3.8212588704887531e-16,3.8497157350504876e-16,3.8783279964117988e-16,
638
     3.9070989352498183e-16,3.9360318987020748e-16,3.9651303029500381e-16,
639
     3.9943976358986842e-16,4.0238374599574693e-16,4.0534534149283966e-16,
640
     4.0832492210071775e-16,4.1132286819038357e-16,4.1433956880894741e-16,
641
     4.1737542201763194e-16,4.2043083524385856e-16,4.2350622564821518e-16,
642
     4.2660202050715582e-16,4.2971865761233266e-16,4.3285658568752094e-16,
643
     4.3601626482415681e-16,4.3919816693657415e-16,4.4240277623809919e-16,
644
     4.4563058973923611e-16,4.4888211776926172e-16,4.5215788452263475e-16,
645
     4.5545842863172421e-16,4.5878430376746227e-16,4.6213607926964266e-16,
646
     4.6551434080870692e-16,4.6891969108099157e-16,4.7235275053955480e-16,
647
     4.7581415816285534e-16,4.7930457226372470e-16,4.8282467134125866e-16,
648
     4.8637515497845119e-16,4.8995674478861404e-16,4.9357018541385775e-16,
649
     4.9721624557917034e-16,5.0089571920591141e-16,5.0460942658884340e-16,
650
     5.0835821564116245e-16,5.1214296321235415e-16,5.1596457648410618e-16,
651
     5.1982399444994938e-16,5.2372218948478484e-16,5.2766016901098856e-16,
652
     5.3163897726836902e-16,5.3565969719590503e-16,5.3972345243389779e-16,
653
     5.4383140945596370e-16,5.4798477984116296e-16,5.5218482269752343e-16,
654
     5.5643284724928722e-16,5.6073021560139669e-16,5.6507834569605064e-16,
655
     5.6947871447763482e-16,5.7393286128396354e-16,5.7844239148359912e-16,
656
     5.8300898038105864e-16,5.8763437741400573e-16,5.9232041066909314e-16,
657
     5.9706899174600906e-16,6.0188212100252363e-16,6.0676189321700068e-16,
658
     6.1171050370897217e-16,6.1673025496306200e-16,6.2182356380685327e-16,
659
     6.2699296919933262e-16,6.3224114069342115e-16,6.3757088764394262e-16,
660
     6.4298516924135947e-16,6.4848710546189033e-16,6.5407998903644809e-16,
661
     6.5976729855445663e-16,6.6555271283433428e-16,6.7144012671064882e-16,
662
     6.7743366840910103e-16,6.8353771870512740e-16,6.8975693209068478e-16,
663
     6.9609626020748846e-16,7.0256097784459588e-16,7.0915671184495837e-16,
664
     7.1588947332085531e-16,7.2276569364381212e-16,7.2979226475290851e-16,
665
     7.3697658441912426e-16,7.4432660721604146e-16,7.5185090208325131e-16,
666
     7.5955871753377488e-16,7.6746005575784274e-16,7.7556575712157906e-16,
667
     7.8388759686228577e-16,7.9243839615735500e-16,8.0123215021130834e-16,
668
     8.1028417659131464e-16,8.1961128778061250e-16,8.2923199285818092e-16,
669
     8.3916673441467979e-16,8.4943816836487701e-16,8.6007149633349414e-16,
670
     8.7109486293879040e-16,8.8253983380721398e-16,8.9444197485198646e-16,
671
     9.0684155971316690e-16,9.1978444098118649e-16,9.3332313294229516e-16,
672
     9.4751817065249841e-16,9.6243983456584759e-16,9.7817036547844198e-16,
673
     9.9480684723838795e-16,1.0124650144288319e-15,1.0312843657756166e-15,
674
     1.0514351604044550e-15,1.0731281954224043e-15,1.0966288068517408e-15,
675
     1.1222774909350319e-15,1.1505212963006663e-15,1.1819635283304206e-15,
676
     1.2174462832361815e-15,1.2581958069755114e-15,1.3060984107128082e-15,
677
     1.3642786158057857e-15,1.4384889932178723e-15,1.5412190700064194e-15,
678
     1.7091034077168055e-15]
679
const fe =
680
    [1.0000000000000000e+00,9.3814368086217470e-01,9.0046992992574648e-01,
681
     8.7170433238120359e-01,8.4778550062398961e-01,8.2699329664305032e-01,
682
     8.0842165152300838e-01,7.9152763697249562e-01,7.7595685204011555e-01,
683
     7.6146338884989628e-01,7.4786862198519510e-01,7.3503809243142348e-01,
684
     7.2286765959357202e-01,7.1127476080507601e-01,7.0019265508278816e-01,
685
     6.8956649611707799e-01,6.7935057226476536e-01,6.6950631673192473e-01,
686
     6.6000084107899970e-01,6.5080583341457110e-01,6.4189671642726609e-01,
687
     6.3325199421436607e-01,6.2485273870366598e-01,6.1668218091520766e-01,
688
     6.0872538207962201e-01,6.0096896636523223e-01,5.9340090169173343e-01,
689
     5.8601031847726803e-01,5.7878735860284503e-01,5.7172304866482582e-01,
690
     5.6480919291240017e-01,5.5803828226258745e-01,5.5140341654064129e-01,
691
     5.4489823767243961e-01,5.3851687200286191e-01,5.3225388026304332e-01,
692
     5.2610421398361973e-01,5.2006317736823360e-01,5.1412639381474856e-01,
693
     5.0828977641064288e-01,5.0254950184134772e-01,4.9690198724154955e-01,
694
     4.9134386959403253e-01,4.8587198734188491e-01,4.8048336393045421e-01,
695
     4.7517519303737737e-01,4.6994482528395998e-01,4.6478975625042618e-01,
696
     4.5970761564213769e-01,4.5469615747461550e-01,4.4975325116275500e-01,
697
     4.4487687341454851e-01,4.4006510084235390e-01,4.3531610321563657e-01,
698
     4.3062813728845883e-01,4.2599954114303434e-01,4.2142872899761658e-01,
699
     4.1691418643300288e-01,4.1245446599716118e-01,4.0804818315203240e-01,
700
     4.0369401253053028e-01,3.9939068447523107e-01,3.9513698183329016e-01,
701
     3.9093173698479711e-01,3.8677382908413765e-01,3.8266218149600983e-01,
702
     3.7859575940958079e-01,3.7457356761590216e-01,3.7059464843514600e-01,
703
     3.6665807978151416e-01,3.6276297335481777e-01,3.5890847294874978e-01,
704
     3.5509375286678746e-01,3.5131801643748334e-01,3.4758049462163698e-01,
705
     3.4388044470450241e-01,3.4021714906678002e-01,3.3658991402867761e-01,
706
     3.3299806876180899e-01,3.2944096426413633e-01,3.2591797239355619e-01,
707
     3.2242848495608917e-01,3.1897191284495724e-01,3.1554768522712895e-01,
708
     3.1215524877417955e-01,3.0879406693456019e-01,3.0546361924459026e-01,
709
     3.0216340067569353e-01,2.9889292101558179e-01,2.9565170428126120e-01,
710
     2.9243928816189257e-01,2.8925522348967775e-01,2.8609907373707683e-01,
711
     2.8297041453878075e-01,2.7986883323697292e-01,2.7679392844851736e-01,
712
     2.7374530965280297e-01,2.7072259679906002e-01,2.6772541993204479e-01,
713
     2.6475341883506220e-01,2.6180624268936298e-01,2.5888354974901623e-01,
714
     2.5598500703041538e-01,2.5311029001562946e-01,2.5025908236886230e-01,
715
     2.4743107566532763e-01,2.4462596913189211e-01,2.4184346939887721e-01,
716
     2.3908329026244918e-01,2.3634515245705964e-01,2.3362878343743335e-01,
717
     2.3093391716962741e-01,2.2826029393071670e-01,2.2560766011668407e-01,
718
     2.2297576805812019e-01,2.2036437584335949e-01,2.1777324714870053e-01,
719
     2.1520215107537868e-01,2.1265086199297828e-01,2.1011915938898826e-01,
720
     2.0760682772422204e-01,2.0511365629383771e-01,2.0263943909370902e-01,
721
     2.0018397469191127e-01,1.9774706610509887e-01,1.9532852067956322e-01,
722
     1.9292814997677135e-01,1.9054576966319539e-01,1.8818119940425432e-01,
723
     1.8583426276219711e-01,1.8350478709776746e-01,1.8119260347549629e-01,
724
     1.7889754657247831e-01,1.7661945459049488e-01,1.7435816917135349e-01,
725
     1.7211353531532006e-01,1.6988540130252766e-01,1.6767361861725019e-01,
726
     1.6547804187493600e-01,1.6329852875190182e-01,1.6113493991759203e-01,
727
     1.5898713896931421e-01,1.5685499236936523e-01,1.5473836938446808e-01,
728
     1.5263714202744286e-01,1.5055118500103989e-01,1.4848037564386679e-01,
729
     1.4642459387834494e-01,1.4438372216063478e-01,1.4235764543247220e-01,
730
     1.4034625107486245e-01,1.3834942886358020e-01,1.3636707092642886e-01,
731
     1.3439907170221363e-01,1.3244532790138752e-01,1.3050573846833077e-01,
732
     1.2858020454522817e-01,1.2666862943751067e-01,1.2477091858083096e-01,
733
     1.2288697950954514e-01,1.2101672182667483e-01,1.1916005717532768e-01,
734
     1.1731689921155557e-01,1.1548716357863353e-01,1.1367076788274431e-01,
735
     1.1186763167005630e-01,1.1007767640518538e-01,1.0830082545103380e-01,
736
     1.0653700405000166e-01,1.0478613930657017e-01,1.0304816017125772e-01,
737
     1.0132299742595363e-01,9.9610583670637132e-02,9.7910853311492199e-02,
738
     9.6223742550432798e-02,9.4549189376055859e-02,9.2887133556043541e-02,
739
     9.1237516631040155e-02,8.9600281910032858e-02,8.7975374467270218e-02,
740
     8.6362741140756913e-02,8.4762330532368119e-02,8.3174093009632383e-02,
741
     8.1597980709237419e-02,8.0033947542319905e-02,7.8481949201606421e-02,
742
     7.6941943170480503e-02,7.5413888734058410e-02,7.3897746992364746e-02,
743
     7.2393480875708738e-02,7.0901055162371829e-02,6.9420436498728755e-02,
744
     6.7951593421936601e-02,6.6494496385339774e-02,6.5049117786753749e-02,
745
     6.3615431999807334e-02,6.2193415408540995e-02,6.0783046445479633e-02,
746
     5.9384305633420266e-02,5.7997175631200659e-02,5.6621641283742877e-02,
747
     5.5257689676697037e-02,5.3905310196046087e-02,5.2564494593071692e-02,
748
     5.1235237055126281e-02,4.9917534282706372e-02,4.8611385573379497e-02,
749
     4.7316792913181548e-02,4.6033761076175170e-02,4.4762297732943282e-02,
750
     4.3502413568888183e-02,4.2254122413316234e-02,4.1017441380414819e-02,
751
     3.9792391023374125e-02,3.8578995503074857e-02,3.7377282772959361e-02,
752
     3.6187284781931423e-02,3.5009037697397410e-02,3.3842582150874330e-02,
753
     3.2687963508959535e-02,3.1545232172893609e-02,3.0414443910466604e-02,
754
     2.9295660224637393e-02,2.8188948763978636e-02,2.7094383780955800e-02,
755
     2.6012046645134217e-02,2.4942026419731783e-02,2.3884420511558171e-02,
756
     2.2839335406385240e-02,2.1806887504283581e-02,2.0787204072578117e-02,
757
     1.9780424338009743e-02,1.8786700744696030e-02,1.7806200410911362e-02,
758
     1.6839106826039948e-02,1.5885621839973163e-02,1.4945968011691148e-02,
759
     1.4020391403181938e-02,1.3109164931254991e-02,1.2212592426255381e-02,
760
     1.1331013597834597e-02,1.0464810181029979e-02,9.6144136425022099e-03,
761
     8.7803149858089753e-03,7.9630774380170400e-03,7.1633531836349839e-03,
762
     6.3819059373191791e-03,5.6196422072054830e-03,4.8776559835423923e-03,
763
     4.1572951208337953e-03,3.4602647778369040e-03,2.7887987935740761e-03,
764
     2.1459677437189063e-03,1.5362997803015724e-03,9.6726928232717454e-04,
765
     4.5413435384149677e-04]
766

767
## Constants
768

769
const ziggurat_nor_r      = 3.6541528853610087963519472518
770
const ziggurat_nor_inv_r  = inv(ziggurat_nor_r)
771
const ziggurat_exp_r      = 7.6971174701310497140446280481
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc