Artifact 85195aacd4611027d963dabde1cc6109f2e60ffc99c7aa3e167bdf8c80544208:
- Executable file
r38/lisp/csl/cslbase/arith.h
— part of check-in
[f2fda60abd]
at
2011-09-02 18:13:33
on branch master
— Some historical releases purely for archival purposes
git-svn-id: https://svn.code.sf.net/p/reduce-algebra/code/trunk/historical@1375 2bfe0521-f11c-4a00-b80e-6202646ff360 (user: arthurcnorman@users.sourceforge.net, size: 7098) [annotate] [blame] [check-ins using] [more...]
/* arith.h Copyright (C) Codemist Ltd, 1990-2007 */ /* * This code may be used and modified, and redistributed in binary * or source form, subject to the "CCL Public License", which should * accompany it. This license is a variant on the BSD license, and thus * permits use of code derived from this in either open and commercial * projects: but it does require that updates to this code be made * available back to the originators of the package. * Before merging other code in with this or linking this code * with other packages or libraries please check that the license terms * of the other material are compatible with those of this. */ /* Signature: 3e3f30ed 18-Jan-2007 */ #ifndef header_arith_h #define header_arith_h 1 #define TWO_32 4294967296.0 /* 2^32 */ #define TWO_31 2147483648.0 /* 2^31 */ #define TWO_24 16777216.0 /* 2^24 */ #define TWO_22 4194304.0 /* 2^22 */ #define TWO_21 2097152.0 /* 2^21 */ #define TWO_20 1048576.0 /* 2^20 */ #define M2_31_1 -2147483649.0 /* -(2^31 + 1) */ #define _pi 3.14159265358979323846 #define _half_pi 1.57079632679489661923 #define boole_clr 0 #define boole_and 1 #define boole_andc2 2 #define boole_1 3 #define boole_andc1 4 #define boole_2 5 #define boole_xor 6 #define boole_ior 7 #define boole_nor 8 #define boole_eqv 9 #define boole_c2 10 #define boole_orc2 11 #define boole_c1 12 #define boole_orc1 13 #define boole_nand 14 #define boole_set 15 /* * Bignums are represented as vectors of digits, where each digit * uses 31 bits, and all but the most significant digit are unsigned * (and thus do not use the 0x80000000L bit). The most significant * digit of a bignum is a signed 2-s complement value in 31 bits that * has been sign extended into the 0x80000000L bit, and thus its top * two bits (in the 32 bit word) will be either '00' or '11'. * NOTE that even on a 64-bit machine I will work with 32-bit values * as digits in bignums. */ #define top_bit_set(n) (((int32_t)(n)) < 0) #define top_bit(n) (((uint32_t)(n)) >> 31) #define set_top_bit(n) ((n) | (uint32_t)0x80000000) #define clear_top_bit(n) ((n) & 0x7fffffff) #define signed_overflow(n) top_bit_set((n) ^ (((int32_t)(n))<<1)) #ifdef HAVE_UINT64_T /* * Here I do some arithmetic in-line. In the following macros I need to * take care that the names used for local variables do not clash with * those used in the body of the code. Hence the names r64 and c64, which * I must agree not to use elsewhere. Note also the "do {} while (0)" idiom * to avoid nasty problems with C syntax and the need for semicolons. */ #define IMULTIPLY 1 /* External function not needed */ #define Dmultiply(hi, lo, a, b, c) \ do { uint64_t r64 = (uint64_t)(a) * (uint64_t)(b) + \ (uint32_t)(c); \ (lo) = 0x7fffffffu & (uint32_t)r64; \ (hi) = (uint32_t)(r64 >> 31); } while (0) #define IDIVIDE 1 #define Ddivide(r, q, a, b, c) \ do { uint64_t r64 = (((uint64_t)(a)) << 31) | (uint64_t)(b); \ uint64_t c64 = (uint64_t)(uint32_t)(c); \ q = (uint32_t)(r64 / c64); \ r = (uint32_t)(r64 % c64); } while (0) #define Ddiv10_9(r, q, a, b) Ddivide(r, q, a, b, 1000000000u) #else #define Dmultiply(hi, lo, a, b, c) ((hi) = Imultiply(&(lo), (a), (b), (c))) #define Ddivide(r, q, a, b, c) ((r) = Idivide(&(q), (a), (b), (c))) #define Ddiv10_9(r, q, a, b) ((r) = Idiv10_9(&(q), (a), (b))) #endif #define fix_mask (-0x08000000) #define fixnum_minusp(a) ((int32_t)(a) < 0) #define bignum_minusp(a) \ ((int32_t)bignum_digits(a)[((bignum_length(a)-CELL)/4)-1]<0) extern Lisp_Object negateb(Lisp_Object); extern Lisp_Object copyb(Lisp_Object); extern Lisp_Object negate(Lisp_Object); extern Lisp_Object plus2(Lisp_Object a, Lisp_Object b); extern Lisp_Object difference2(Lisp_Object a, Lisp_Object b); extern Lisp_Object times2(Lisp_Object a, Lisp_Object b); extern Lisp_Object quot2(Lisp_Object a, Lisp_Object b); extern Lisp_Object CLquot2(Lisp_Object a, Lisp_Object b); extern Lisp_Object quotbn(Lisp_Object a, int32_t n); extern Lisp_Object quotbn1(Lisp_Object a, int32_t n); extern Lisp_Object quotbb(Lisp_Object a, Lisp_Object b); extern Lisp_Object Cremainder(Lisp_Object a, Lisp_Object b); extern Lisp_Object rembi(Lisp_Object a, Lisp_Object b); extern Lisp_Object rembb(Lisp_Object a, Lisp_Object b); extern Lisp_Object shrink_bignum(Lisp_Object a, int32_t lena); extern Lisp_Object modulus(Lisp_Object a, Lisp_Object b); extern Lisp_Object rational(Lisp_Object a); extern Lisp_Object rationalize(Lisp_Object a); extern Lisp_Object lcm(Lisp_Object a, Lisp_Object b); extern Lisp_Object lengthen_by_one_bit(Lisp_Object a, int32_t msd); extern CSLbool numeq2(Lisp_Object a, Lisp_Object b); extern CSLbool zerop(Lisp_Object a); extern CSLbool onep(Lisp_Object a); extern CSLbool minusp(Lisp_Object a); extern CSLbool plusp(Lisp_Object a); extern CSLbool lesspbd(Lisp_Object a, double b); extern CSLbool lessprd(Lisp_Object a, double b); extern CSLbool lesspdb(double a, Lisp_Object b); extern CSLbool lesspdr(double a, Lisp_Object b); extern Lisp_Object make_one_word_bignum(int32_t n); extern Lisp_Object make_two_word_bignum(int32_t a, uint32_t b); extern Lisp_Object make_n_word_bignum(int32_t a1, uint32_t a2, uint32_t a3, int32_t n); extern Lisp_Object make_sfloat(double d); extern double float_of_integer(Lisp_Object a); extern Lisp_Object add1(Lisp_Object p); extern Lisp_Object sub1(Lisp_Object p); extern Lisp_Object integerp(Lisp_Object p); extern double float_of_number(Lisp_Object a); extern Lisp_Object make_boxfloat(double a, int32_t type); extern Lisp_Object make_complex(Lisp_Object r, Lisp_Object i); extern Lisp_Object make_ratio(Lisp_Object p, Lisp_Object q); extern Lisp_Object ash(Lisp_Object a, Lisp_Object b); extern Lisp_Object lognot(Lisp_Object a); extern Lisp_Object logior2(Lisp_Object a, Lisp_Object b); extern Lisp_Object logxor2(Lisp_Object a, Lisp_Object b); extern Lisp_Object logand2(Lisp_Object a, Lisp_Object b); extern Lisp_Object logeqv2(Lisp_Object a, Lisp_Object b); extern Lisp_Object rationalf(double d); extern int _reduced_exp(double, double *); extern CSLbool lesspbi(Lisp_Object a, Lisp_Object b); extern CSLbool lesspib(Lisp_Object a, Lisp_Object b); #ifdef COMMON typedef struct Complex { double real; double imag; } Complex; extern Complex MS_CDECL Cln(Complex a); extern Complex MS_CDECL Ccos(Complex a); extern Complex MS_CDECL Cexp(Complex a); extern Complex MS_CDECL Cpow(Complex a, Complex b); extern double MS_CDECL Cabs(Complex a); #endif #endif /* header_arith_h */ /* end of arith.h */