[Top][All Lists]
[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