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.

Reply via email to