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:
Dam Sunwoo 2012-01-09 18:08:20 -06:00
parent 6a6d888ab4
commit 3f9e352de4

View file

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