Log to the base 2 in python

How should I compute log to the base two in python. Eg. I have this equation where I am using log base 2

import math e = -(t/T)* math.log((t/T)[, 2]) 
4

10 Answers

It's good to know that

log_b(a) = log(a)/log(b)

but also know that math.log takes an optional second argument which allows you to specify the base:

In [22]: import math In [23]: math.log? Type: builtin_function_or_method Base Class: <type 'builtin_function_or_method'> String Form: <built-in function log> Namespace: Interactive Docstring: log(x[, base]) -> the logarithm of x to the given base. If the base not specified, returns the natural logarithm (base e) of x. In [25]: math.log(8,2) Out[25]: 3.0 
3

Depends on whether the input or output is int or float.

assert 5.392317422778761 == math.log2(42.0) assert 5.392317422778761 == math.log(42.0, 2.0) assert 5 == math.frexp(42.0)[1] - 1 assert 5 == (42).bit_length() - 1 

float → float math.log2(x)

import math log2 = math.log(x, 2.0) log2 = math.log2(x) # python 3.3 or later 

float → int math.frexp(x)

If all you need is the integer part of log base 2 of a floating point number, extracting the exponent is pretty efficient:

log2int_slow = int(math.floor(math.log(x, 2.0))) # these give the log2int_fast = math.frexp(x)[1] - 1 # same result 
  • Python frexp() calls the C function frexp() which just grabs and tweaks the exponent.

  • Python frexp() returns a tuple (mantissa, exponent). So [1] gets the exponent part.

  • For integral powers of 2 the exponent is one more than you might expect. For example 32 is stored as 0.5x2⁶. This explains the - 1 above. Also works for 1/32 which is stored as 0.5x2⁻⁴.

  • Floors toward negative infinity, so log₂31 computed this way is 4 not 5. log₂(1/17) is -5 not -4.


int → int x.bit_length()

If both input and output are integers, this native integer method could be very efficient:

log2int_faster = x.bit_length() - 1 
  • - 1 because 2ⁿ requires n+1 bits. Works for very large integers, e.g. 2**10000.

  • Floors toward negative infinity, so log₂31 computed this way is 4 not 5.

2

If you are on python 3.3 or above then it already has a built-in function for computing log2(x)

import math 'finds log base2 of x' answer = math.log2(x) 

If you are on older version of python then you can do like this

import math 'finds log base2 of x' answer = math.log(x)/math.log(2) 
0

Using numpy:

In [1]: import numpy as np In [2]: np.log2? Type: function Base Class: <type 'function'> String Form: <function log2 at 0x03049030> Namespace: Interactive File: c:\python26\lib\site-packages\numpy\lib\ufunclike.py Definition: np.log2(x, y=None) Docstring: Return the base 2 logarithm of the input array, element-wise. Parameters ---------- x : array_like Input array. y : array_like Optional output array with the same shape as `x`. Returns ------- y : ndarray The logarithm to the base 2 of `x` element-wise. NaNs are returned where `x` is negative. See Also -------- log, log1p, log10 Examples -------- >>> np.log2([-1, 2, 4]) array([ NaN, 1., 2.]) In [3]: np.log2(8) Out[3]: 3.0 

def lg(x, tol=1e-13): res = 0.0 # Integer part while x<1: res -= 1 x *= 2 while x>=2: res += 1 x /= 2 # Fractional part fp = 1.0 while fp>=tol: fp /= 2 x *= x if x >= 2: x /= 2 res += fp return res 
1
>>> def log2( x ): ... return math.log( x ) / math.log( 2 ) ... >>> log2( 2 ) 1.0 >>> log2( 4 ) 2.0 >>> log2( 8 ) 3.0 >>> log2( 2.4 ) 1.2630344058337937 >>> 
1

Try this ,

import math print(math.log(8,2)) # math.log(number,base) 

In python 3 or above, math class has the following functions

import math math.log2(x) math.log10(x) math.log1p(x) 

or you can generally use math.log(x, base) for any base you want.

1

Don't forget that log[base A] x = log[base B] x / log[base B] A.

So if you only have log (for natural log) and log10 (for base-10 log), you can use

myLog2Answer = log10(myInput) / log10(2) 

Use help method

>>> import math >>> help(math.log) Help on built-in function log in module math: log(...) log(x, [base=math.e]) Return the logarithm of x to the given base. If the base not specified, returns the natural logarithm (base e) of x. (END) 

log(x, [base=math.e])

Return the logarithm of x to the given base.

0

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like