Greetings, and thanks so much for your report! Something similar going in now!
Take care, Daniel Gildea <gil...@cs.rochester.edu> writes: > Here is a patch with a more precision-aware implementation of > division of complex numbers. I based this code on the implementation > in sbcl. This patch fixes an error in the maxima test suite: > > Running tests in rtest_elliptic: > ***************** rtest_elliptic.mac: Problem 232 (line 1071) > ***************** > > Input: > closeto(jacobi_am(1.5, 1.5 + %i) - (0.9340542168700783 > - 0.3723960452146072 %i), > 5.4673E-16) > > > Result: > 1.0990647210786426E-15 > > This differed from the expected result: > true > > > diff --git a/gcl/o/num_arith.c b/gcl/o/num_arith.c > index a31743cba..fdc7b4b38 100644 > --- a/gcl/o/num_arith.c > +++ b/gcl/o/num_arith.c > @@ -1006,18 +1006,32 @@ number_divide(object x, object y) > > x = number_to_complex(x); > y = number_to_complex(y); > - z1 = number_times(y->cmp.cmp_real, y->cmp.cmp_real); > - z2 = number_times(y->cmp.cmp_imag, y->cmp.cmp_imag); > - z3 = number_plus(z1, z2); > - /* if (number_zerop(z3 = number_plus(z1, z2))) > DIVISION_BY_ZERO(sLD,list(2,x,y)); */ > - z1 = number_times(x->cmp.cmp_real, y->cmp.cmp_real); > - z2 = number_times(x->cmp.cmp_imag, y->cmp.cmp_imag); > - z1 = number_plus(z1, z2); > - z = number_times(x->cmp.cmp_imag, y->cmp.cmp_real); > - z2 = number_times(x->cmp.cmp_real, y->cmp.cmp_imag); > - z2 = number_minus(z, z2); > - z1 = number_divide(z1, z3); > - z2 = number_divide(z2, z3); > + if ( 1 == number_compare(number_abs(y->cmp.cmp_real), > + number_abs(y->cmp.cmp_imag)) ) { > + object r = number_divide(y->cmp.cmp_imag, y->cmp.cmp_real); > + object dn = number_plus(y->cmp.cmp_real, > + number_times(r, y->cmp.cmp_imag)); > + z1 = number_divide(number_plus(x->cmp.cmp_real, > + number_times(x->cmp.cmp_imag, > + r)), > + dn); > + z2 = number_divide(number_minus(x->cmp.cmp_imag, > + number_times(x->cmp.cmp_real, > + r)), > + dn); > + } else { > + object r = number_divide(y->cmp.cmp_real, y->cmp.cmp_imag); > + object dn = number_plus(y->cmp.cmp_imag, > + number_times(r, y->cmp.cmp_real)); > + z1 = number_divide(number_plus(number_times(x->cmp.cmp_real, > + r), > + x->cmp.cmp_imag), > + dn); > + z2 = number_divide(number_minus(number_times(x->cmp.cmp_imag, > + r), > + x->cmp.cmp_real), > + dn); > + } > z = make_complex(z1, z2); > return(z); > } > > > > -- Camm Maguire c...@maguirefamily.org ========================================================================== "The earth is but one country, and mankind its citizens." -- Baha'u'llah