Thanks for the clarifications, all. Had not thought about exact vs. inexact results.
Also, I see that --- if I simply want to know if a number is a (mathematical) decimal number, I can just do `(or (float? x) (decimal? x))`. -- John On Friday, June 12, 2015 at 12:08:56 PM UTC-4, Gary Verhaegen wrote: > > Your definitions are correct, but in a different domain: you are using the > mathematical definitions. > > What these functions give you is information about the representation of > the numbers in memory, not information about the numbers themselves. For > example, (integer? 1.0) will give you false. > > A rational number in mathematics is one that can be written as a fraction > (of integers), or equivalently one that does not have an infinite and > non-periodic expansion. A rational number in the sense of "rational?" in > Clojure is an object in memory which is actually stored as a couple of > integers, not merely a valie that could be stored that way. > > As others have mentioned, the way in which a number is stored will have > some impact on how much memory it takes up, how fast the computer can > compute operations on it, and how much precision will be lost with these > operations. > > As always, Clojure puts more emphasis on behaviours and interfaces than on > implementations, so you should really understand "rational?" as "will I get > an exact answer if I use operations that would give an exact answer with a > rational number (in the mathematical sense)?" > > For example, (/ 1M 3) will throw an exception rather than returning an > inexact, truncated answer, whereas (/ 1.0 3) will happily lie to you. > (According to the documentation, BigDecimal always returns a correct value > or throws an exception, except if you explicitly tell it to round. It can > represent values down to about 1e-2_147_483_647, and up to filling your > computer's memory.) > > For a first step towards understanding floating-point values, I would > recommend reading: > > > http://blog.reverberate.org/2014/09/what-every-computer-programmer-should.html > > On Friday, 12 June 2015, John Gabriele <jmg3...@gmail.com> wrote: > >> My understanding is that a rational number is one that can be written as >> a fraction. For example, 5.1, which can be written as 51/10. But Clojure >> seems to disagree: >> >> ~~~ >> (rational? 51/10) ;=> true >> (rational? 5.1) ;=> false (?!) >> ~~~ >> >> Is my definition of "rational" incorrect? >> >> Also, my understanding is that a decimal number is one that has a decimal >> point in it, like, for example, 5.1. However: >> >> ~~~ >> (decimal? 5.1) ;=> false (?!) >> ~~~ >> >> And while typing this, I also notice that while `integer?` acts like I'd >> expect, `float?` does something weird: >> >> ~~~ >> (integer? 5) ;=> true Yes >> (integer? 5N) ;=> true Yes >> (integer? 5.1) ;=> false >> >> (float? 5.1) ;=> true >> (float? 5.1M) ;=> false (?!) >> ~~~ >> >> Maybe I'm confusing "floating point number" with "decimal number" here? >> If so, what's the difference? >> >> Thanks! >> >> -- >> You received this message because you are subscribed to the Google >> Groups "Clojure" group. >> To post to this group, send email to clojure@googlegroups.com >> Note that posts from new members are moderated - please be patient with >> your first post. >> To unsubscribe from this group, send email to >> clojure+unsubscr...@googlegroups.com >> For more options, visit this group at >> http://groups.google.com/group/clojure?hl=en >> --- >> You received this message because you are subscribed to the Google Groups >> "Clojure" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to clojure+unsubscr...@googlegroups.com. >> For more options, visit https://groups.google.com/d/optout. >> > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.