Obtenir logarithme sans mathématiques journal python
Je suis en train d'apprendre Python et je dois faire un script pour générer le résultat du journal.
Je sais que de base du log x = résultat
Puis j'ai fait mon code.
def log(x, base):
log_b = 2
while x != int(round(base ** log_b)):
log_b += 0.01
print log_b
return int(round(log_b))
Mais il fonctionne très lentement. Je peux utiliser une autre méthode? merci!
- Bien sûr, il existe de nombreux algorithmes. Que diriez-vous de faire quelques recherches sur certains de ceux-ci, et de venir poser une question spécifique si vous avez besoin d'aide pour comprendre un?
- cela devient ridicule...
- Je suppose que c'est pour le collège d'affectation. Certains professeurs refusent de laisser leurs élèves d'utiliser le standard libs.
- Pour être honnête, vous n'avez pas à apprendre des choses comme cela, sauf si vous implémentez des choses (mal) pour vous-même la première fois
- pourquoi ne pas passer par en.wikipedia.org/wiki/Natural_logarithm , il liste plusieurs méthodes pour le calcul de journal et d'essayer de les mettre en œuvre toutes, et ensuite poser des question si ça ne marchait pas
- Je pourrais jurer que j'ai vu une question identique aujourd'hui, mais je ne le trouve pas... ah, nous y voilà: stackoverflow.com/questions/13207854/... bien, que l'on avait cassé le code si.
Vous devez vous connecter pour publier un commentaire.
Une autre chose que vous pourriez envisager est l'aide de l' de la série de Taylor du logarithme népérien:
Une fois que vous avez approchée le logarithme naturel à l'aide d'un certain nombre de termes de cette série, il est facile de changer de base:
MODIFIER: Voici un autre utile d'identité:
En utilisant cela, on pourrait écrire quelque chose le long des lignes de
La tester, nous avons:
De sortie:
Cela montre la valeur de notre rapport à la
math.log
valeur (séparés par un espace) et, comme vous pouvez le voir, nous sommes assez précis. Vous aurez probablement commencer à perdre un peu de précision que vous obtenez de très grande (par exemple,ln(10000)
sera d'environ0.4
plus qu'il ne le devrait), mais vous pouvez toujours augmentern
si vous en avez besoin.log_10
dans votre dernière équation?x
avec la matrice,1
de l'identité, et mais comment faire pour calculerx**(1/n)
?J'ai utilisé la récursivité:
Vous pouvez utiliser la recherche binaire pour que.
Vous pouvez obtenir plus d'informations sur la recherche binaire http://en.wikipedia.org/wiki/Binary_search_algorithm;
Fondamentalement, vous commencez avec 0 et x et appliquer l'algorithme. Je vais écrire un peu de code pour vous dans une minute.
Quelque chose comme ça.
Comparaison:-
C'est la façon dont votre journal des travaux:-
C'est mon projet d'amélioration:-
qui est plus rapide, à l'aide de la
%timeit
fonction magique dans iPython au moment de l'exécution à des fins de comparaison.Il sera long processus, car il va dans une boucle. Par conséquent,
Valeurs sont à peu près égaux, mais elle n'est pas exacte.
Ctrl+K
qui en retrait de tout, quatre espaces de sorte qu'il ressemble de code dans le navigateur.