Clojure possède une fonction de puissance qui fonctionne bien : Je vous recommande de l'utiliser plutôt que de passer par l'interopérabilité Java, car elle gère correctement tous les types de nombres à précision arbitraire de Clojure. Elle se trouve dans l'espace de noms clojure.math.numeric-tower .
Ça s'appelle expt
para exponentiation plutôt que power
o pow
ce qui explique peut-être pourquoi il est un peu difficile à trouver ... de toute façon voici un petit exemple (notez que use
fonctionne mais meilleure utilisation require
):
(require '[clojure.math.numeric-tower :as math :refer [expt]]) ; as of Clojure 1.3
;; (use 'clojure.contrib.math) ; before Clojure 1.3
(expt 2 200)
=> 1606938044258990275541962092341162602522202993782792835301376
Rappel sur l'installation des paquets
Vous devez d'abord installer le paquetage Java org.clojure.math.numeric-tower
pour que l'espace de noms Clojure clojure.math.numeric-tower
accessible !
Sur la ligne de commande :
$ lein new my-example-project
$ cd lein new my-example-project
Puis modifier project.clj
et ajouter [org.clojure/math.numeric-tower "0.0.4"]
au vecteur de dépendances.
Démarrer un REPL lein (pas un REPL clojure)
$ lein repl
Maintenant :
(require '[clojure.math.numeric-tower :as math])
(math/expt 4 2)
;=> 16
ou
(require '[clojure.math.numeric-tower :as math :refer [expt]])
(expt 4 2)
;=> 16
26 votes
En tant que personne qui ne connaît pas clojure, mais qui est prédisposée à l'aimer (étant un fan des lisps, de la programmation fonctionnelle, et ayant beaucoup de bibliothèques pratiques), je suis déçue que cette question simple ait tant de réponses - ou qu'elle doive être posée. J'aurais pensé que l'exponentiation serait juste une des fonctions de base fournies sans avoir à faire quoi que ce soit de spécial. Mais je suis content qu'elle ait été posée.
2 votes
Le "multiple path to implementation" semble être la raison pour laquelle beaucoup de ces choses ne sont pas fournies - l'utilisateur devrait connaître les détails de la fonction qu'il utilise pour des raisons d'efficacité. par exemple (comme indiqué dans la réponse choisie), certaines méthodes peuvent potentiellement faire sauter la pile, d'autres moins. par exemple (comme le souligne la réponse choisie), certaines façons de faire peuvent potentiellement faire sauter la pile, d'autres moins. peut-être que certains sont paresseux, d'autres enthousiastes... tous les détails doivent être pris en compte dans Clojure, c'est pourquoi je pense que la plupart des librairies non triviales ne sont pas fournies en raison de leur philosophie.
4 votes
Je pense que la raison pour laquelle il n'y a pas simplement une fonction exp dans le noyau est que la tour numérique de clojure est mal fichue pour des raisons d'efficacité. Il y a donc toutes sortes de choses différentes que l'on peut signifier par exponentiation. Que devrait être (exp 2 (exp 2 200)) ? Une erreur ou un énorme nombre entier qui prend un temps fou à calculer ? Si vous voulez simplement l'exp à virgule flottante habituelle, alors celle de Java est intégrée. Si vous voulez un langage où les nombres font de leur mieux pour agir comme les réels, et en supporter le coût, utilisez scheme au lieu de clojure.