optimize number_abs and number_signum - gcl.git - GNU Common Lisp

index : gcl.git
GNU Common Lisp
summary refs log tree commit diff
diff options
context:
space:
mode:
authorCamm Maguire <camm@debian.org>2013年10月10日 20:17:11 +0000
committerCamm Maguire <camm@debian.org>2013年10月10日 20:17:11 +0000
commitc37664e1da93f3308d1d5e7a8f8655c71ca24cad (patch)
treefb5470eca18911b77ffa47abb2db4c74784ab508
parenta5468a483bed3997a3ec3e5862848ffa2ccde901 (diff)
downloadgcl-fast-fixnum.tar.gz
optimize number_abs and number_signumfast-fixnum
Diffstat
-rwxr-xr-xgcl/o/num_sfun.c 51
1 files changed, 48 insertions, 3 deletions
diff --git a/gcl/o/num_sfun.c b/gcl/o/num_sfun.c
index 266a58b82..024b54d03 100755
--- a/gcl/o/num_sfun.c
+++ b/gcl/o/num_sfun.c
@@ -287,8 +287,11 @@ COMPLEX:
object
number_abs(object x) {
+
object r,i,z;
+
switch(type_of(x)) {
+
case t_complex:
if (number_zerop(x)) return x;
r=number_abs(x->cmp.cmp_real);
@@ -300,15 +303,57 @@ number_abs(object x) {
}
z=number_divide(i,r);
return number_times(r,number_sqrt(one_plus(number_times(z,z))));
- break;
+
+ case t_fixnum:
+ {fixnum fx=fix(x);return fx==MOST_NEGATIVE_FIX ? fixnum_add(1,MOST_POSITIVE_FIX) : (fx<0 ? make_fixnum(-fx) : x);}
+
+ case t_bignum:
+ return big_sign(x)<0 ? big_minus(x) : x;
+
+ case t_ratio:
+ {object n=number_abs(x->rat.rat_num);return n==x ? x : make_ratio(n,x->rat.rat_den);}
+
+ case t_shortfloat:
+ return sf(x)<0.0 ? make_shortfloat(-sf(x)) : x;
+
+ case t_longfloat:
+ return lf(x)<0.0 ? make_longfloat(-lf(x)) : x;
+
default:
- return number_minusp(x) ? number_negate(x) : x;
+ FEwrong_type_argument(sLnumber,x);
+ return(Cnil);
}
}
object
number_signum(object x) {
- return number_zerop(x) ? x : number_divide(x,number_abs(x));
+
+ switch (type_of(x)) {
+
+ case t_fixnum:
+ {fixnum fx=fix(x);return make_fixnum(fx<0 ? -1 : (fx==0 ? 0 : 1));}
+
+ case t_bignum:
+ return make_fixnum(big_sign(x)<0 ? -1 : 1);
+
+ case t_ratio:
+ return number_signum(x->rat.rat_num);
+
+ case t_shortfloat:
+ return make_shortfloat(sf(x)<0.0 ? -1.0 : (sf(x)==0.0 ? 0.0 : 1.0));
+
+ case t_longfloat:
+ return make_longfloat(lf(x)<0.0 ? -1.0 : (lf(x)==0.0 ? 0.0 : 1.0));
+
+ case t_complex:
+ return number_zerop(x) ? x : number_divide(x,number_abs(x));
+
+ default:
+ FEwrong_type_argument(sLnumber,x);
+ return(Cnil);
+
+ }
+
}
static object
generated by cgit v1.2.3 (git 2.39.1) at 2025年09月01日 17:54:15 +0000

AltStyle によって変換されたページ (->オリジナル) /