]> git.sesse.net Git - stockfish/blobdiff - src/book.cpp
Fix a possible 'Division by zero'
[stockfish] / src / book.cpp
index 98e9e155b4330341996872979930a50743e89e49..fbb1984cf5cba6ca183465f7b58b5d4bbeaedb0a 100644 (file)
@@ -315,7 +315,7 @@ namespace {
   uint64_t book_key(const Position& pos) {
 
     uint64_t key = 0;
-    Bitboard b = pos.occupied_squares();
+    Bitboard b = pos.pieces();
 
     while (b)
     {
@@ -323,8 +323,7 @@ namespace {
         key ^= ZobPiece[PieceOffset[pos.piece_on(s)] + s];
     }
 
-    b =  (pos.can_castle(WHITE_OO) << 0) | (pos.can_castle(WHITE_OOO) << 1)
-       | (pos.can_castle(BLACK_OO) << 2) | (pos.can_castle(BLACK_OOO) << 3);
+    b = pos.can_castle(ALL_CASTLES);
 
     while (b)
         key ^= ZobCastle[pop_1st_bit(&b)];
@@ -342,7 +341,7 @@ namespace {
 
 Book::Book() : size(0) {
 
-  for (int i = abs(system_time() % 10000); i > 0; i--)
+  for (int i = Time::current_time().msec() % 10000; i > 0; i--)
       RKiss.rand<unsigned>(); // Make random number generation less deterministic
 }
 
@@ -383,7 +382,7 @@ bool Book::open(const char* fName) {
       return false; // Silently fail if the file is not found
 
   // Get the book size in number of entries, we are already at the end of file
-  size = tellg() / sizeof(BookEntry);
+  size = (size_t)tellg() / sizeof(BookEntry);
 
   if (!good())
   {
@@ -421,7 +420,7 @@ Move Book::probe(const Position& pos, const string& fName, bool pickBest) {
       // Choose book move according to its score. If a move has a very
       // high score it has higher probability to be choosen than a move
       // with lower score. Note that first entry is always chosen.
-      if (   (RKiss.rand<unsigned>() % sum < e.count)
+      if (   (sum && RKiss.rand<unsigned>() % sum < e.count)
           || (pickBest && e.count == best))
           move = Move(e.move);
   }
@@ -458,30 +457,30 @@ Move Book::probe(const Position& pos, const string& fName, bool pickBest) {
 
 void Book::binary_search(uint64_t key) {
 
-  size_t left, right, mid;
+  size_t low, high, mid;
   BookEntry e;
 
-  left = 0;
-  right = size - 1;
+  low = 0;
+  high = size - 1;
 
-  assert(left <= right);
+  assert(low <= high);
 
-  while (left < right && good())
+  while (low < high && good())
   {
-      mid = (left + right) / 2;
+      mid = (low + high) / 2;
 
-      assert(mid >= left && mid < right);
+      assert(mid >= low && mid < high);
 
       seekg(mid * sizeof(BookEntry), ios_base::beg);
       *this >> e;
 
       if (key <= e.key)
-          right = mid;
+          high = mid;
       else
-          left = mid + 1;
+          low = mid + 1;
   }
 
-  assert(left == right);
+  assert(low == high);
 
-  seekg(left * sizeof(BookEntry), ios_base::beg);
+  seekg(low * sizeof(BookEntry), ios_base::beg);
 }