summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/boot.clj5
-rw-r--r--src/jvm/clojure/lang/Numbers.java20
-rw-r--r--src/jvm/clojure/lang/RT.java5
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",