diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/boot.clj | 5 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Numbers.java | 20 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 5 |
3 files changed, 27 insertions, 3 deletions
diff --git a/src/boot.clj b/src/boot.clj index a395590d..c9afa590 100644 --- a/src/boot.clj +++ b/src/boot.clj @@ -594,6 +594,11 @@ [num div] (. clojure.lang.Numbers (remainder num div))) +(defn rationalize + "returns the rational value of num" + [num] + (. clojure.lang.Numbers (rationalize num))) + ;;Bit ops (defn bit-shift-left diff --git a/src/jvm/clojure/lang/Numbers.java b/src/jvm/clojure/lang/Numbers.java index 9ae8e06c..91dcefe9 100644 --- a/src/jvm/clojure/lang/Numbers.java +++ b/src/jvm/clojure/lang/Numbers.java @@ -182,13 +182,29 @@ static Ratio toRatio(Object x){ BigInteger bv = bx.unscaledValue(); int scale = bx.scale(); if(scale < 0) - return new Ratio(bv, BigInteger.TEN.pow(-scale)); + return new Ratio(bv.multiply(BigInteger.TEN.pow(-scale)),BigInteger.ONE); else - return new Ratio(bv.multiply(BigInteger.TEN.pow(scale)), BigInteger.ONE); + return new Ratio(bv,BigInteger.TEN.pow(scale)); } return new Ratio(toBigInteger(x), BigInteger.ONE); } +static public Number rationalize(Number x){ + if(x instanceof Float || x instanceof Double) + return rationalize(BigDecimal.valueOf(x.doubleValue())); + else if(x instanceof BigDecimal) + { + BigDecimal bx = (BigDecimal) x; + BigInteger bv = bx.unscaledValue(); + int scale = bx.scale(); + if(scale < 0) + return bv.multiply(BigInteger.TEN.pow(-scale)); + else + return divide(bv, BigInteger.TEN.pow(scale)); + } + return x; +} + static public Number reduce(BigInteger val){ if(val.bitLength() < 32) return val.intValue(); diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java index 4d3b60dd..ed4de6b7 100644 --- a/src/jvm/clojure/lang/RT.java +++ b/src/jvm/clojure/lang/RT.java @@ -19,6 +19,7 @@ import java.util.regex.Matcher; import java.io.*; import java.lang.reflect.Array; import java.math.BigDecimal; +import java.math.BigInteger; public class RT{ @@ -82,7 +83,9 @@ Symbol.create("Iterable"), Iterable.class, Symbol.create("Readable"), Readable.class, Symbol.create("Runnable"), Runnable.class, Symbol.create("Callable"), Callable.class, -Symbol.create("Exception"), Exception.class +Symbol.create("Exception"), Exception.class, +Symbol.create("BigInteger"), BigInteger.class, +Symbol.create("BigDecimal"), BigDecimal.class // Symbol.create("Collection"), "java.util.Collection", // Symbol.create("Comparator"), "java.util.Comparator", // Symbol.create("Enumeration"), "java.util.Enumeration", |