This is num_log.c in view mode; [Download] [Up]
Changes file for /usr/local/src/kcl/./c/num_log.c Created on Sat Feb 23 18:40:26 1991 Usage \n@s[Original text\n@s|Replacement Text\n@s] See the file rascal.ics.utexas.edu:/usr2/ftp/merge.c for a program to merge change files. Anything not between "\n@s[" and "\n@s]" is a simply a comment. This file was constructed using emacs and merge.el Enhancements Copyright (c) W. Schelter All rights reserved. by (Bill Schelter) wfs@carl.ma.utexas.edu ****Change:(orig (12 12 c)) @s[#include "num_include.h" @s|#include "num_include.h" #include "mp.h" @s] ****Change:(orig (18 18 a)) @s[ fixnum or bignum ( not normalized ) */ @s| fixnum or bignum ( not normalized ) */ object big_log_op(); @s] ****Change:(orig (25 25 c)) @s[ struct bignum *big_log_op(); @s| @s] ****Change:(orig (43 43 a)) @s[ x = (object)copy_to_big(vs_base[0]); vs_push(x); i = 1; @s| x = (object)copy_to_big(vs_base[0]); vs_push(x); i = 1; {save_avma; @s] ****Change:(orig (47 47 a)) @s[ x = (object)big_log_op(x, vs_base[i], op); i++; } @s| x = (object)big_log_op(x, vs_base[i], op); i++; } restore_avma;} @s] ****Change:(orig (54 54 a)) @s[ x and y, and return the result in x destructively. @s| x and y, and return the result in x destructively. @s] ****Change:(orig (56 66 d)) @s[struct bignum * big_log_op(x, y, op) struct bignum *x; object y; @s, int end_x, end_y; int i, j; @s| @s] ****Change:(orig (68 89 c)) @s[ r = x; /* remember start of x */ if (type_of(x) != t_bignum) FEwrong_type_argument(Sbignum, x); else if (big_sign(x) < 0) { @s, FEwrong_type_argument(Sinteger, y); @s|void minimize_lg(x) GEN x; {int j,i,lgx = lgef(x); GEN u = x+2; i = lgx; i -= 2; while (-- i >= 0) { if (*u++) break; } j = lgx -i -3; if (j) { GEN v = x+2; GEN w = v + j; GEN lim = x+lgx; while (w<lim) {*v++ = *w++;} setlgef(x,(i+3));} if (i==-1) setsigne(x,0); } @s] ****Change:(orig (91 124 d)) @s[ end_x = end_y = 0; while ((end_x == 0) || (end_y == 0)) { if (end_x == 0) i = (x->big_car) & MASK; @s, x->big_car |= ((*op)(sign_x, sign_y) & ~MASK); @s| @s] ****Change:(orig (126 126 c)) @s[ return(r); @s| /* Fix this. Should be destructive into x0. It is for the benefit of log_op; Maybe write an mp version, and then do it. */ GEN complementi(x) GEN x; {int l = lgef(x); GEN u = cgeti(l); unsigned long * v ; unsigned long *w ; MP_START_LOW(w,(unsigned long *)x,l); MP_START_LOW(v,(unsigned long *)u,l); setlgef(u,l); setsigne(u,1); l -= MP_CODE_WORDS; {unsigned int next=0; while (--l >=0) { unsigned int last = MP_NEXT_UP(w); MP_NEXT_UP(v) = next - last ; if (last > next) { next -= 1 ;}} return u;}} object big_log_op(x0,y0,op) object x0,y0; long (*op)(); { int leadx,leady; int result_length; int lgx,lgy; GEN x,y,u,up,result; save_avma; x = MP(x0); y = (type_of(y0)==t_bignum ? MP(y0) : stoi(fix(y0))); leadx = signe(x); lgx=lgef(x); if (leadx < 0) x = complementi(x); else leadx = 0; lgy = lgef(y); leady = signe(y); if (leady < 0) y=complementi(y); else leady = 0; result_length = (lgx > lgy ? lgx : lgy); u = result = cgeti(result_length); setlgef(result,result_length); MP_START_LOW(u,u,result_length); result_length -= MP_CODE_WORDS; x += lgx; y += lgy; lgx -= MP_CODE_WORDS; lgy -= MP_CODE_WORDS; while (--lgx >= 0) { if (--lgy >= 0) { MP_NEXT_UP(u) = (*op)(MP_NEXT_UP(x),MP_NEXT_UP(y));} else MP_NEXT_UP(u) = (*op)(MP_NEXT_UP(x),leady); } /* lgx is now 0 */ while (--lgy >= 0) { MP_NEXT_UP(u) = (*op)(leadx,MP_NEXT_UP(y));} {int leadresult = (*op)(leadx,leady); if (leadresult < 0) { result = complementi(result); setsigne(result,-1);} else setsigne(result,1);} minimize_lg(result); restore_avma; gcopy_to_big(result,x0); return x0; @s] ****Change:(orig (127 127 a)) @s[} @s|} @s] ****Change:(orig (239 255 c)) @s[{ int sign, cell, bit, i; if (p >= 0) { @s, return((x->big.big_car >> bit) & 1); } else return(0); @s|{ GEN u = MP(x); int ans ; int i = p /32; if (signe(u) < 0) { save_avma; u = complementi(u); restore_avma; } if (i < lgef(u)) { ans = ((MP_ITH_WORD(u,i,lgef(u))) & (1 << p%32));} else if (big_sign(x) < 0) ans = 1; else ans = 0; return ans; @s] ****Change:(orig (278 278 c)) @s[ for (i=0; i < 31; i++) count += ((x >> i) & 1); @s| for (i=0; i <= 31; i++) count += ((x >> i) & 1); @s] ****Change:(orig (292 302 c)) @s[ } else if (type_of(x) == t_bignum) { count = 0; sign = big_sign(x); for (;;) { @s, x = (object)x->big.big_cdr; } } else @s| } else if (type_of(x) == t_bignum) { save_avma; GEN u = MP(x); if (signe(u) < 0) { u = subsi(-1,u);} count = 0; {int leng = lgef(u); MP_START_LOW(u,u,leng); leng -= MP_CODE_WORDS; while (--leng >= 0) { count += count_int_bits(MP_NEXT_UP(u));}} restore_avma; } else @s] ****Change:(orig (312 314 d)) @s[double_shift(h, l, w, hp, lp) int h, l, w, *hp, *lp; { @s| @s] ****Change:(orig (316 325 d)) @s[ if (w >= 0) { *lp = (l << w) & MASK; *hp = ((h << w) & MASK) | ((l & MASK) >> (31 - w)); } else { @s, *lp = ((h << (31 - w)) & MASK) | ((l & MASK) >> w); } } @s| @s] ****Change:(orig (330 419 c)) @s[{ struct bignum *y, *y0; object r; int cell, bits, sign, i; @s, r = normalize_big_to_object(y0); vs_reset; return(r); @s|{ GEN u ; if (type_of(x) == t_fixnum) { if (w <= 0) return make_fixnum (fix(x) >> (-w)); MPOP(return, shifti,stoi(fix(x)),w); } else if (type_of(x) == t_bignum) MPOP(return, shifti,MP(x),w); else FEwrong_type_argument(Sinteger, x); @s] ****Change:(orig (421 421 c)) @s[} @s|} @s] ****Change:(orig (429 429 c)) @s[ for (j = 0; j < 31 ; j++) @s| for (j = 0; j <= 31 ; j++) @s] ****Change:(orig (433 433 a)) @s[ if (((i >> j) & 1) == 1) count = j + 1; return(count); } @s| if (((i >> j) & 1) == 1) count = j + 1; return(count); } @s] ****Change:(orig (588 588 c)) @s[ vs_top = vs_base; if (i == 1) @s| vs_top = vs_base; if (i) @s] ****Change:(orig (662 662 d)) @s[ int count, cell, i; check_arg(1); check_type_integer(&vs_base[0]); @s| int count, cell, i; check_arg(1); @s] ****Change:(orig (668 678 c)) @s[ } else if (type_of(x) == t_bignum) { cell = 0; while(x->big.big_cdr != NULL) { cell++; @s, count = cell * 31 + int_bit_length(i); } else ; @s| } else if (type_of(x) == t_bignum) { GEN w,u = MP(x); int l = lg(u); ulong high; w = u; MP_START_HIGH(u,u,l); high = MP_NEXT_DOWN(u); count = int_bit_length(high) ; l -= MP_CODE_WORDS; if (signe(w) < 0 && high == (1 << (count -1))) /* in the case of -(1<< n) it is one less */ { int ll = l; int nzero = 0; while (--ll > 0) { if (MP_NEXT_DOWN(u)) {nzero= 1; break;}} if (nzero == 0) --count ;} count += 32* (l - 1); } else FEwrong_type_argument(Sinteger, x); @s] ****Change:(orig (682 682 a)) @s[ vs_push(make_fixnum(count)); } @s| vs_push(make_fixnum(count)); } #define W_SIZE (8*sizeof(int)) object bitand(a,b,c) object a,b,c; { int d= a->bv.bv_fillp; int *ap,*bp,*cp; d=(d+W_SIZE-1)/W_SIZE; ap= (int *)(a->bv.bv_self); bp= (int *)(b->bv.bv_self); cp= (int *)(c->bv.bv_self); while (--d >= 0) { *cp++ = *bp++ & *ap++; } return c; } @s] ****Change:(orig (684 684 c)) @s[ object Sbit; @s| object bitior(a,b,c) object a,b,c; { int *ap,*cp,*bp, d= a->bv.bv_fillp; d=(d+W_SIZE-1)/W_SIZE; ap= (int *)((a->bv.bv_self)); bp= (int *)(b->bv.bv_self); cp= (int *)(c->bv.bv_self); while (--d >= 0) { *cp++ = *bp++ | *ap++; } return c; } /* Note in order to be equal we assume that the part above the fill pointer is 0 up to the next word */ bvequal(a,b) object a,b; { int *ap,*bp, d= a->bv.bv_fillp; d=(d+W_SIZE-1)/W_SIZE; ap= (int *)(a->bv.bv_self); bp= (int *)(b->bv.bv_self); while (--d >= 0) { if (*ap++ != *bp++) return 1; } return 0; } @s]
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.