Hello everyone
I had a go at adding support for complex numbers, it's at:
https://github.com/andrea-chiavazza/clojure/tree/complex
Some repl usage examples:
user=> (/ (complex 73 13) (complex 15 25))
#<Complex (142/85 -163/85i)>
user=> (/ (complex 73 13) (complex 15.0 25.0))
#<Complex (1.6705882352941177 -1.9176470588235295i)>
user=> (+ (complex 13 34) (complex 29 -34))
42
user=> (require 'clojure.math)
user=> (clojure.math/abs (complex -14.94 21))
25.772147756832375
user=> (clojure.math/sqrt -3)
#<Complex (0 +1.7320508075688772i)>
user=> (clojure.math/sqrt 2)
1.4142135623730951
user=> (clojure.math/sqrt (complex 2 3))
#<Complex (1.6741492280355401 +0.895977476129838i)>
user=> (= (complex 12 34) (complex 12 34.0))
false
user=> (== (complex 12 34) (complex 12 34.0))
true
I'm still not sure why #<Complex comes up, while #<Ratio doesn't with
similar operations.
What also worries me a bit is that I changed a bunch of methods in
Numbers.java from accepting Object to being overloaded to accept Number and
Complex.
For example, this:
static public Number add(Object x, Object y){
return ops(x).combine(ops(y)).add((Number)x, (Number)y);
}
Has become:
static public Number add(Number x, Number y){
return ops(x).combine(ops(y)).add(x, y);
}
So that I could overload with this:
static public Object add(Complex x, Complex y) {
Number r = add(x.real, y.real);
Number im = add(x.imaginary, y.imaginary);
if (isZero(im))
return r;
else
return new Complex(r, im);
}
A consequence is that this test:
(is (thrown? ClassCastException (+ "ab" "cd"))) ) ; no string
concatenation
Has become:
(is (thrown? IllegalArgumentException (+ "ab" "cd"))) ) ; no string
concatenation
I thought that overloading would be nicer and would avoid having to check
for the class of the Object.
On the other hand all methods seem to accept an Object and then cast to
Number rather than just accepting a Number, so there might be a good reason
for that.
Could somebody please enlighten me on this so that I can do it the right
way ?
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en