diff src/fns.c @ 1983:9c872f33ecbe

[xemacs-hg @ 2004-04-05 22:49:31 by james] Add bignum, ratio, and bigfloat support.
author james
date Mon, 05 Apr 2004 22:50:11 +0000
parents c66036f59678
children fd0cbe945410
line wrap: on
line diff
--- a/src/fns.c	Mon Apr 05 21:50:47 2004 +0000
+++ b/src/fns.c	Mon Apr 05 22:50:11 2004 +0000
@@ -149,9 +149,9 @@
 
 DEFUN ("random", Frandom, 0, 1, 0, /*
 Return a pseudo-random number.
-All integers representable in Lisp are equally likely.
-  On most systems, this is 28 bits' worth.
+All fixnums are equally likely.  On most systems, this is 31 bits' worth.
 With positive integer argument N, return random number in interval [0,N).
+N can be a bignum, in which case the range of possible values is extended.
 With argument t, set the random number seed from the current time and pid.
 */
        (limit))
@@ -175,6 +175,13 @@
 	val = get_random () / denominator;
       while (val >= XINT (limit));
     }
+#ifdef HAVE_BIGNUM
+  else if (BIGNUMP (limit))
+    {
+      bignum_random (scratch_bignum, XBIGNUM_DATA (limit));
+      return Fcanonicalize_number (make_bignum_bg (scratch_bignum));
+    }
+#endif
   else
     val = get_random ();
 
@@ -2840,8 +2847,33 @@
   QUIT;
   if (EQ_WITH_EBOLA_NOTICE (obj1, obj2))
     return 1;
+#ifdef WITH_NUMBER_TYPES
+  if (NUMBERP (obj1) && NUMBERP (obj2))
+    {
+      switch (promote_args (&obj1, &obj2))
+	{
+	case FIXNUM_T:
+	  return XREALINT (obj1) == XREALINT (obj2);
+#ifdef HAVE_BIGNUM
+	case BIGNUM_T:
+	  return bignum_eql (XBIGNUM_DATA (obj1), XBIGNUM_DATA (obj2));
+#endif
+#ifdef HAVE_RATIO
+	case RATIO_T:
+	  return ratio_eql (XRATIO_DATA (obj1), XRATIO_DATA (obj2));
+#endif
+	case FLOAT_T:
+	  return XFLOAT_DATA (obj1) == XFLOAT_DATA (obj2);
+#ifdef HAVE_BIGFLOAT
+	case BIGFLOAT_T:
+	  return bigfloat_eql (XBIGFLOAT_DATA (obj1), XBIGFLOAT_DATA (obj2));
+#endif
+	}
+    }
+#else
   if ((INTP (obj1) && FLOATP (obj2)) || (FLOATP (obj1) && INTP (obj2)))
     return extract_float (obj1) == extract_float (obj2);
+#endif
   if (CHARP (obj1) && CHARP (obj2))
     return DOWNCASE (0, XCHAR (obj1)) == DOWNCASE (0, XCHAR (obj2));
   if (XTYPE (obj1) != XTYPE (obj2))