00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "util/cached_log.h"
00015
00016 #include "base/logging.h"
00017
00018 namespace operations_research {
00019
00020 CachedLog::CachedLog() {}
00021
00022 CachedLog::~CachedLog() {}
00023
00024 namespace {
00025 double FastLog2(int64 input) {
00026 #if defined(_MSC_VER)
00027 return log(static_cast<double>(input)) / log(2.0L);
00028 #else
00029 return log2(input);
00030 #endif
00031 }
00032 }
00033
00034 void CachedLog::Init(int size) {
00035 CHECK(cache_.empty());
00036 CHECK_GT(size, 0);
00037 cache_.resize(size, 0.0);
00038 for (int i = 0; i < size; ++i) {
00039 cache_[i] = FastLog2(i + 1);
00040 }
00041 }
00042
00043 double CachedLog::Log2(int64 input) const {
00044 CHECK_GE(input, 1);
00045 if (input <= cache_.size()) {
00046 return cache_[input - 1];
00047 } else {
00048 return FastLog2(input);
00049 }
00050 }
00051
00052 }