gcl-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Gcl-devel] algorithm for arithmetic operations between t_ratio


From: Camm Maguire
Subject: Re: [Gcl-devel] algorithm for arithmetic operations between t_ratio
Date: 20 Aug 2004 18:00:55 -0400
User-agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.2

Greetings!  Took at stab at this:

Implemented in CVS.

Some timings:

(with-open-file (s "/tmp/all" :direction :output)  (dolist (op '(+ - * /)) 
(dolist (den '(t nil)) (dotimes (i 50000) (let ((base 4000000000)) (let ((a (/ 
(random base) (if den 1 (random base)))) (b (/ (random base) (random base)))) 
(let ((c (list op a b)) (d (list op b a)))(format s "~S~%"  (cons c (eval 
c)))(format s "~S~%"  (cons d (eval d))))))))))

(progn (setq z (let (r) (with-open-file (s "/tmp/all") (do () ((let ((a (read s 
nil nil))) (push a r) (not a))))) r)) nil)

old:

(time (dolist (a z) (unless (or (not a) (eql (eval (car a)) (cdr a))) (error 
"~S ~S~%" a (eval (car a))))))

real time       :     40.170 secs
run-gbc time    :     15.110 secs
child run time  :      0.000 secs
gbc time        :     24.920 secs
NIL

>

new:

(time (dolist (a z) (unless (or (not a) (eql (eval (car a)) (cdr a))) (error 
"~S ~S~%" a (eval (car a))))))

real time       :      8.000 secs
run-gbc time    :      5.240 secs
child run time  :      0.000 secs
gbc time        :      2.640 secs
NIL

>

Please test.
  
Take care,

Vanuxem Grégory <address@hidden> writes:

> Hi,
> 
> >From support request [support #103220]:
> 
> I tried this for for + (and - with modification) operation, but i don't
> know if I had to push objects created:
> 
> case t_ratio:{ 
>       object g, num, den, num1, den1, tmp; 
>       vs_mark; 
>       den1 = get_gcd(x->rat.rat_den,          y->rat.rat_den); 
>       vs_push(den1); 
>       num = integer_divide1(x->rat.rat_den, den1); 
>       vs_push(num); 
>       den = integer_divide1(y->rat.rat_den, den1); 
>       vs_push(den); 
>       num1 = number_times(den,x->rat.rat_num);
>       vs_push(num1);
>       tmp = number_times(num,y->rat.rat_num); 
>       vs_push(tmp);
>       num1 = number_plus(num1, tmp); //or number_minus
>       vs_push(num1); 
>       g = get_gcd(num1, den1); 
>       vs_push(g); 
>       num1 = integer_divide1(num1, g); 
>       vs_push(num1); 
>       den1 = integer_divide1(den1, g); 
>       vs_push(den1); 
>       tmp = number_times(den1, num); 
>       vs_push(tmp); 
>       den1 = number_times(tmp, den); 
>       vs_push(den1); 
>       if(type_of(den1) == t_fixnum &&  fix(den1) == 1) { 
>               vs_reset; 
>               return(num1); 
>       } 
>       z = alloc_object(t_ratio); 
>       z->rat.rat_num = num1; 
>       z->rat.rat_den = den1; 
>       vs_reset; 
> } 
> return(z); 
> 
> 
> is this code correct ? 
> 
> Cheers, Greg
> 
> 
> _______________________________________________
> Gcl-devel mailing list
> address@hidden
> http://lists.gnu.org/mailman/listinfo/gcl-devel
> 
> 
> 

-- 
Camm Maguire                                            address@hidden
==========================================================================
"The earth is but one country, and mankind its citizens."  --  Baha'u'llah




reply via email to

[Prev in Thread] Current Thread [Next in Thread]