Ce que vous avez devrait fonctionner si vous supprimez les crochets autour du ", 2" dans l' math.log()appel. L'as tu essayé?
martineau
5
beau calcul d'entropie
Muhammad Alkarouri
math.log (valeur, base)
Valentin Heinitz
Réponses:
230
C'est bon de savoir que
mais sachez aussi que
math.logprend un second argument optionnel qui vous permet de spécifier la base:
In[22]:import math
In[23]: math.log?Type: builtin_function_or_method
BaseClass:<type 'builtin_function_or_method'>StringForm:<built-in function log>Namespace:InteractiveDocstring:
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
Si tout ce dont vous avez besoin est la partie entière du journal de base 2 d'un nombre à virgule flottante, l'extraction de l'exposant est assez efficace:
Python frexp () appelle la fonction C frexp () qui saisit et ajuste simplement l'exposant.
Python frexp () renvoie un tuple (mantisse, exposant). Obtient donc [1]la partie exposant.
Pour les puissances intégrales de 2, l'exposant est un de plus que ce à quoi vous pourriez vous attendre. Par exemple, 32 est stocké sous la forme 0,5x2⁶. Ceci explique ce qui - 1précède. Fonctionne également pour 1/32 qui est stocké en 0,5x2⁻⁴.
Les étages vers l'infini négatif, donc log₂31 est 4 pas 5. log₂ (1/17) est -5 et non -4.
Intéressant. Donc vous soustrayez 1 ici parce que la mantisse est dans la plage [0,5, 1,0)? Je donnerais à celui-ci quelques votes supplémentaires si je le pouvais.
LarsH
1
Exactement à droite @LarsH. 32 est stocké comme 0.5x2⁶ donc si vous voulez log₂32 = 5, vous devez soustraire 1 . Également vrai pour 1/32 qui est stocké en tant que 0,5x2⁻⁴.
Bob Stein
16
Si vous utilisez python 3.4 ou supérieur, il possède déjà une fonction intégrée pour calculer log2 (x)
import math
'finds log base2 of x'
answer = math.log2(x)
Si vous utilisez une ancienne version de python, vous pouvez faire comme ceci
import math
'finds log base2 of x'
answer = math.log(x)/math.log(2)
In[1]:import numpy as np
In[2]: np.log2?Type: function
BaseClass:<type 'function'>StringForm:<function log2 at 0x03049030>Namespace:InteractiveFile: 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.SeeAlso--------
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 partwhile x<1:
res -=1
x *=2while x>=2:
res +=1
x /=2# Fractional part
fp =1.0while fp>=tol:
fp /=2
x *= x
if x >=2:
x /=2
res += fp
return res
math.log()
appel. L'as tu essayé?Réponses:
C'est bon de savoir que
mais sachez aussi que
math.log
prend un second argument optionnel qui vous permet de spécifier la base:la source
base
argument ajouté dans la version 2.3, btw.?
) est l'introspection dynamique d'objets .flotter → flotter
math.log2(x)
float → int
math.frexp(x)
Si tout ce dont vous avez besoin est la partie entière du journal de base 2 d'un nombre à virgule flottante, l'extraction de l'exposant est assez efficace:
Python frexp () appelle la fonction C frexp () qui saisit et ajuste simplement l'exposant.
Python frexp () renvoie un tuple (mantisse, exposant). Obtient donc
[1]
la partie exposant.Pour les puissances intégrales de 2, l'exposant est un de plus que ce à quoi vous pourriez vous attendre. Par exemple, 32 est stocké sous la forme 0,5x2⁶. Ceci explique ce qui
- 1
précède. Fonctionne également pour 1/32 qui est stocké en 0,5x2⁻⁴.Les étages vers l'infini négatif, donc log₂31 est 4 pas 5. log₂ (1/17) est -5 et non -4.
int → int
x.bit_length()
Si l'entrée et la sortie sont des entiers, cette méthode native entière pourrait être très efficace:
- 1
car 2ⁿ nécessite n + 1 bits. Fonctionne pour de très grands nombres entiers, par exemple2**10000
.Les étages vers l'infini négatif, donc log₂31 est 4 pas 5. log₂ (1/17) est -5 et non -4.
la source
Si vous utilisez python 3.4 ou supérieur, il possède déjà une fonction intégrée pour calculer log2 (x)
Si vous utilisez une ancienne version de python, vous pouvez faire comme ceci
la source
Utilisation de numpy:
la source
http://en.wikipedia.org/wiki/Binary_logarithm
la source
la source
math.log
fonction. Voir la réponse d'unutbu.Essaye ça ,
la source
logbase2 (x) = log (x) / log (2)
la source
En python 3 ou supérieur, la classe math a les fonctions de jachère
ou vous pouvez généralement utiliser
math.log(x, base)
pour n'importe quelle base que vous voulez.la source
log_base_2 (x) = log (x) / log (2)
la source
N'oubliez pas que log [base A] x = log [base B] x / log [base B] A .
Donc, si vous n'avez que
log
(pour le journal naturel) etlog10
(pour le journal de base 10), vous pouvez utiliserla source