10
votes

Pourquoi clojure clojure.lang.ratio 3/2 non = 1,5

Je suis perdu dans le ratio de goûts. Je ne peux pas le comprendre. Pourquoi les tests d'égalité et d'inégalité se comportent-ils de cette manière? XXX


2 commentaires

Cette question n'est pas un duplicata de: Stackoverflow.com/questions/2364566/and-in-clojure? RQ = 1 Parce que la langue a changé depuis cette question, les exemples de cette question de cette question ne fonctionnent pas. Il pose également la question d'un contexte différent


Au fait, ce n'est pas spécifique aux ratios. (= 1 1.0) retourne false .


3 Réponses :


12
votes

Utilisez == code> pour des comparaisons numériques où vous voulez savoir si deux numéros représentent le même nombre quel que soit les types: xxx pré>

bien que gardez à l'esprit que == code> est uniquement pour les chiffres b> et les lancers si donné quelque chose n'est pas un Nombre. P>

user> (== :1 :1)
ClassCastException clojure.lang.Keyword cannot be cast to java.lang.Number  clojure.lang.Numbers.equiv (Numbers.java:206)


2 commentaires

Comme votre réponse montre, (==: 1: 1) jette une exception. Il ne retourne pas faux - comme cela faisait - ou quoi que ce soit d'autre.


Désolé, j'ai oublié de modifier ma réponse après avoir testé et ajouté l'exemple.



2
votes

Clojure tente difficile de vous éloigner des flotteurs comme ils sont susceptibles d'arrondies erreurs: xxx

donc la raison réelle La comparaison échoue est qu'il n'y a pas de moyen précis de représenter 1,5 interne, et le moment où l'analyseur de clojure consomme des informations "1,5" est potentiellement perdue .

En utilisant des fractions, il n'y a pas de perte d'informations, la formulaire de fraction 3/2 peut donc être transmise librement à d'autres fonctions sans crainte d'erreurs d'arrondissement de FULAWAY Comme ce fut le cas avec le casque infâme Patriot Missile Bug.


2 commentaires

Hmm. En supposant que le clojure utilise des flotteurs Binary64 IEEE 754 (comme Java, et à peu près toutes les autres langues traditionnelles), 1.5 absolument peut être représenté avec précision, car il est exprimé parfaitement en binaire 1.1 . 1.4 serait une question différente, bien sûr ...


D'accord, la phrase correcte alors serait "Chaque fois que la gojure consomme un flotteur, des informations pourraient être perdues ..."



1
votes

Mettez simplement, dans le ratio de clojure est un type. Il n'essaie pas de le convertir en double ou float ou quelque chose de ce genre. Ce passage, vous pouvez conserver ce que le nombre représente réellement sans perdre de précision.

Check-out Rich Hickey's Talk appelé "Clojure pour les programmeurs Java" à Youtube, il l'explique mieux.


0 commentaires