summaryrefslogtreecommitdiff
path: root/numpy/random/src
diff options
context:
space:
mode:
authorKevin Sheppard <kevin.k.sheppard@gmail.com>2021-10-06 09:45:21 +0100
committerKevin Sheppard <kevin.sheppard@gmail.com>2021-10-06 23:23:14 +0100
commit401b26e880117ae5bc72b84a7fd267e999f99aa1 (patch)
tree3d5b3ea5f8aa63e198e2a7c6e1dddeb8ab550601 /numpy/random/src
parent9d32403470293c102de87b4fa26ce31a6879f361 (diff)
downloadnumpy-401b26e880117ae5bc72b84a7fd267e999f99aa1.tar.gz
BUG: Correct incorrect advance in PCG with emulated int128
Correct incorrect implemetation of carry in PCG64 and PCG64DXSM when advancing more than 2**64 steps closes #20048
Diffstat (limited to 'numpy/random/src')
-rw-r--r--numpy/random/src/pcg64/pcg64.c3
1 files changed, 1 insertions, 2 deletions
diff --git a/numpy/random/src/pcg64/pcg64.c b/numpy/random/src/pcg64/pcg64.c
index c623c809b..b9be1e39d 100644
--- a/numpy/random/src/pcg64/pcg64.c
+++ b/numpy/random/src/pcg64/pcg64.c
@@ -109,8 +109,7 @@ pcg128_t pcg_advance_lcg_128(pcg128_t state, pcg128_t delta, pcg128_t cur_mult,
cur_plus = pcg128_mult(pcg128_add(cur_mult, PCG_128BIT_CONSTANT(0u, 1u)),
cur_plus);
cur_mult = pcg128_mult(cur_mult, cur_mult);
- delta.low >>= 1;
- delta.low += delta.high & 1;
+ delta.low = (delta.low >> 1) | (delta.high << 63);
delta.high >>= 1;
}
return pcg128_add(pcg128_mult(acc_mult, state), acc_plus);