Base: Fixed shift amount in genrand() to work with large numbers
The previous version didn't work correctly with max integer values (2^31-1 for 32-bit, 2^63-1 for 64bit version), causing "shift" to become -1. For smaller numbers, it wouldn't have caused functional errors, but would have resulted in more than necessary loops in the while loop. Special-cased cases when (max + 1 == 0) to prevent the ceilLog2 functions from failing.
This commit is contained in:
parent
6a6d888ab4
commit
3f9e352de4
1 changed files with 9 additions and 2 deletions
|
@ -29,6 +29,7 @@
|
|||
* Ali Saidi
|
||||
*/
|
||||
|
||||
#include <limits>
|
||||
#include "base/fenv.hh"
|
||||
#include "base/intmath.hh"
|
||||
#include "base/misc.hh"
|
||||
|
@ -67,7 +68,10 @@ Random::genrand(uint32_t max)
|
|||
{
|
||||
if (max == 0)
|
||||
return 0;
|
||||
int log = ceilLog2(max) + 1;
|
||||
if (max == std::numeric_limits<uint32_t>::max())
|
||||
return genrand();
|
||||
|
||||
int log = ceilLog2(max + 1);
|
||||
int shift = (sizeof(uint32_t) * 8 - log);
|
||||
uint32_t random;
|
||||
|
||||
|
@ -83,7 +87,10 @@ Random::genrand(uint64_t max)
|
|||
{
|
||||
if (max == 0)
|
||||
return 0;
|
||||
int log = ceilLog2(max) + 1;
|
||||
if (max == std::numeric_limits<uint64_t>::max())
|
||||
return genrand();
|
||||
|
||||
int log = ceilLog2(max + 1);
|
||||
int shift = (sizeof(uint64_t) * 8 - log);
|
||||
uint64_t random;
|
||||
|
||||
|
|
Loading…
Reference in a new issue