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 <javascript:_e(%7B%7D,'cvml','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.