/*
* $Revision: 2523 $
*
* last checkin:
* $Author: gutwenger $
* $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
***************************************************************/
/** \file
* \brief Mathematical Helpers
*
* \author Markus Chimani
*
* \par License:
* This file is part of the Open Graph Drawing Framework (OGDF).
*
* \par
* Copyright (C)
* See README.txt in the root directory of the OGDF installation for details.
*
* \par
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* Version 2 or 3 as published by the Free Software Foundation;
* see the file LICENSE.txt included in the packaging of this file
* for details.
*
* \par
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* \par
* You should have received a copy of the GNU General Public
* License along with this program; if not, write to the Free
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
* \see http://www.gnu.org/copyleft/gpl.html
***************************************************************/
#ifndef OGDF_MATH_H
#define OGDF_MATH_H
#include "basic.h"
#include
namespace ogdf {
//#define DOUBLE_EPS 0.000001
class OGDF_EXPORT Math {
public:
//! The constant \f$\pi\f$.
static const double pi;
//! The constant \f$\frac{\pi}{2}\f$.
static const double pi_2;
//! The constant \f$\frac{\pi}{4}\f$.
static const double pi_4;
//! The constant \f$2\pi\f$.
static const double two_pi;
//! Euler's number.
static const double e;
//! The constant log(2.0).
static const double log_of_2;
//! The constant log(4.0).
static const double log_of_4;
//! Returns the logarithm of \a x to the base 2.
static double log2(double x) {
OGDF_ASSERT(x >= 0)
return log(x) / log_of_2;
}
//! Returns the logarithm of \a x to the base 4.
static double log4(double x) {
OGDF_ASSERT(x >= 0)
return log(x) / log_of_4;
}
//! Returns \f$n \choose k\f$.
static int binomial(int n, int k);
//! Returns \f$n \choose k\f$.
static double binomial_d(int n, int k);
//! Returns \a n!.
static int factorial(int n);
//! Returns \a n!.
static double factorial_d(int n);
//static bool equald(double a, double b) {
// double d = a-b;
// return d < DOUBLE_EPS && d > -DOUBLE_EPS;
//}
/*!
* \brief A fast method to obtain the rounded down binary logarithm of an 32-bit integer
*
* This is based on http://en.wikipedia.org/wiki/Binary_logarithm
* @param v The number of which the binary logarithm is to be determined
* @return The rounded down logarithm base 2 if v is positive, -1 otherwise
*/
static int floorLog2(int v) {
if (v <= 0) {
return -1;
} else {
int result = 0;
if (v >= (1 << 16)) {
v >>= 16;
result += 16;
}
if (v >= (1 << 8)) {
v >>= 8;
result += 8;
}
if (v >= (1 << 4)) {
v >>= 4;
result += 4;
}
if (v >= (1 << 2)) {
v >>= 2;
result += 2;
}
if (v >= (1 << 1)) {
result += 1;
}
return result;
}
}
};
}
#endif // OGDF_MATH_H