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]) 410 Answers
It's good to know that
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 3Depends 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 - Thanks @akashchandrakar and @unutbu.
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
- 1above. 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 - 1because 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.
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) 0Using 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 >>> 1Try 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.
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) 0log(x, [base=math.e])
Return the logarithm of x to the given base.
