Boost logo

Boost :

From: Mario Ruetti (mruetti_at_[hidden])
Date: 2004-01-10 04:31:56


I wrote a little test program to reproduce the error. myGen is a 'generator'
which produces uint64_t sized numbers....
This produces a floating-point exception. See the comment at the end of this
message how to fix this bug.

       Mario Rütti

// snipp ----

#include <iostream>
#include <cmath>

#include <boost/random.hpp>

class myGen
{
public:
  typedef uint64_t result_type;
  result_type min() const { return 0; }
  result_type max() const { return std::numeric_limits< myGen::result_type
>::max(); }
  result_type operator()()
  {
    return std::numeric_limits< myGen::result_type >::max()-1;
  }
};

int main()
{
  // no problem
  using boost::mt19937;
  mt19937 rng;
  boost::variate_generator< mt19937, boost::uniform_int<> > uni_rng( rng,
boost::uniform_int<>(0,10) );
  for (int i=0;i<10;i++)
    std::cout << uni_rng() << std::endl;

 //problem (Gleitkomma-Ausnahme)
  myGen myrng;
  boost::variate_generator< myGen, boost::uniform_int<> > myuni_rng( myrng,
boost::uniform_int<>(0,10) );
  for (int i=0;i<10;i++)
    std::cout << myuni_rng() << std::endl;
}

// snapp ----

// Change in 'uniform_smallint.hpp' in

// template<class IntType = int>
// class uniform_smallint
// {
// .....

// template<class Engine>
// result_type operator()(Engine& eng)
// {
// typedef typename Engine::result_type base_result;
// base_result _range = static_cast<base_result>(_max-_min)+1;
// // int _factor = 1; <-- original code
// base_result _factor = 1; <-- replacement
// ^^^^^^^^^^^^^^^^^^^^^^^^
// int is to small, use base_result as type for _factor

-- 
+++ GMX - die erste Adresse für Mail, Message, More +++
Neu: Preissenkung für MMS und FreeMMS! http://www.gmx.net

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk