<random>: Use _Unsigned128 for linear_congruential_engine (#5436) · microsoft/STL@8e9f4ee (original) (raw)
`@@ -3,15 +3,18 @@
`
3
3
``
4
4
`// implements multiprecision math for random number generators
`
5
5
``
6
``
`-
#include
`
7
``
`-
#include
`
``
6
`+
#include <yvals.h>
`
8
7
``
9
8
`_STD_BEGIN
`
10
``
`-
constexpr int shift = _STD numeric_limits::digits / 2;
`
``
9
`+
constexpr int _MP_len = 5;
`
``
10
`+
using _MP_arr = unsigned long long[_MP_len];
`
``
11
+
``
12
`+
constexpr int shift = 64 / 2;
`
11
13
`constexpr unsigned long long mask = (0ULL << shift);
`
12
14
`constexpr unsigned long long maxVal = mask + 1;
`
13
15
``
14
``
`-
[[nodiscard]] unsigned long long __CLRCALL_PURE_OR_CDECL _MP_Get(
`
``
16
`+
// TRANSITION, ABI: preserved for binary compatibility
`
``
17
`+
[[nodiscard]] _CRTIMP2_PURE unsigned long long __CLRCALL_PURE_OR_CDECL _MP_Get(
`
15
18
` _MP_arr u) noexcept { // convert multi-word value to scalar value
`
16
19
`return (u[1] << shift) + u[0];
`
17
20
`}
`
`@@ -32,7 +35,8 @@ static void add(unsigned long long* u, int ulen, unsigned long long* v,
`
32
35
` }
`
33
36
`}
`
34
37
``
35
``
`-
void __CLRCALL_PURE_OR_CDECL _MP_Add(
`
``
38
`+
// TRANSITION, ABI: preserved for binary compatibility
`
``
39
`+
_CRTIMP2_PURE void __CLRCALL_PURE_OR_CDECL _MP_Add(
`
36
40
` _MP_arr u, unsigned long long v0) noexcept { // add scalar value to multi-word value
`
37
41
`unsigned long long v[2];
`
38
42
` v[0] = v0 & mask;
`
`@@ -50,7 +54,8 @@ static void mul(
`
50
54
` }
`
51
55
`}
`
52
56
``
53
``
`-
void __CLRCALL_PURE_OR_CDECL _MP_Mul(
`
``
57
`+
// TRANSITION, ABI: preserved for binary compatibility
`
``
58
`+
_CRTIMP2_PURE void __CLRCALL_PURE_OR_CDECL _MP_Mul(
`
54
59
` _MP_arr w, unsigned long long u0, unsigned long long v0) noexcept { // multiply multi-word value by multi-word value
`
55
60
`constexpr int m = 2;
`
56
61
`constexpr int n = 2;
`
`@@ -106,7 +111,8 @@ static void div(_MP_arr u,
`
106
111
`return ulen;
`
107
112
`}
`
108
113
``
109
``
`-
void __CLRCALL_PURE_OR_CDECL _MP_Rem(
`
``
114
`+
// TRANSITION, ABI: preserved for binary compatibility
`
``
115
`+
_CRTIMP2_PURE void __CLRCALL_PURE_OR_CDECL _MP_Rem(
`
110
116
` _MP_arr u, unsigned long long v0) noexcept { // divide multi-word value by value, leaving remainder in u
`
111
117
`unsigned long long v[2];
`
112
118
` v[0] = v0 & mask;
`