<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;

`