Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 #include "SgSystem.h"
00006 #include "SgFastLog.h"
00007 
00008 #include <limits>
00009 #include <cmath>
00010 #include <boost/static_assert.hpp>
00011 
00012 using namespace std;
00013 
00014 
00015 
00016 namespace {
00017 
00018 
00019 BOOST_STATIC_ASSERT(sizeof(int) == 4);
00020 
00021 
00022 BOOST_STATIC_ASSERT(numeric_limits<float>::is_iec559);
00023 
00024 } 
00025 
00026 
00027 
00028 SgFastLog::SgFastLog(int mantissaBits)
00029     : m_mantissaBitsDiff(MAX_MANTISSA_BITS - mantissaBits)
00030 {
00031     m_lookupTable = new float[1 << mantissaBits];
00032     IntFloat x;
00033     x.m_int = 0x3F800000;
00034     int incr = (1 << m_mantissaBitsDiff);
00035     int p = static_cast<int>(pow(2.0f, mantissaBits));
00036     float invLogTwo = 1.f / log(2.f);
00037     for (int i = 0; i < p; ++i)
00038     {
00039         m_lookupTable[i] = log(x.m_float) * invLogTwo;
00040         x.m_int += incr;
00041     }
00042 }
00043 
00044 SgFastLog::~SgFastLog()
00045 {
00046     delete[] m_lookupTable;
00047 }
00048 
00049