1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-17 17:20:29 +02:00

(scm_divide): Correction to 1/complex and <any>/complex,

need to test abs(re)<abs(im) for choice of cases, otherwise divide by
zero when re==0 and im<0.  Reported by Jean Crepeau.
This commit is contained in:
Kevin Ryde 2005-04-29 22:54:35 +00:00
parent 9147cd32d0
commit 1c9c30b6b2

View file

@ -3738,7 +3738,7 @@ scm_divide (SCM x, SCM y)
} else if (SCM_COMPLEXP (x)) { } else if (SCM_COMPLEXP (x)) {
double r = SCM_COMPLEX_REAL (x); double r = SCM_COMPLEX_REAL (x);
double i = SCM_COMPLEX_IMAG (x); double i = SCM_COMPLEX_IMAG (x);
if (r <= i) { if (fabs(r) <= fabs(i)) {
double t = r / i; double t = r / i;
double d = i * (1.0 + t * t); double d = i * (1.0 + t * t);
return scm_make_complex (t / d, -1.0 / d); return scm_make_complex (t / d, -1.0 / d);
@ -3782,7 +3782,7 @@ scm_divide (SCM x, SCM y)
{ {
double r = SCM_COMPLEX_REAL (y); double r = SCM_COMPLEX_REAL (y);
double i = SCM_COMPLEX_IMAG (y); double i = SCM_COMPLEX_IMAG (y);
if (r <= i) { if (fabs(r) <= fabs(i)) {
double t = r / i; double t = r / i;
double d = i * (1.0 + t * t); double d = i * (1.0 + t * t);
return scm_make_complex ((a * t) / d, -a / d); return scm_make_complex ((a * t) / d, -a / d);
@ -3873,7 +3873,7 @@ scm_divide (SCM x, SCM y)
} else if (SCM_COMPLEXP (y)) { } else if (SCM_COMPLEXP (y)) {
double ry = SCM_COMPLEX_REAL (y); double ry = SCM_COMPLEX_REAL (y);
double iy = SCM_COMPLEX_IMAG (y); double iy = SCM_COMPLEX_IMAG (y);
if (ry <= iy) { if (fabs(ry) <= fabs(iy)) {
double t = ry / iy; double t = ry / iy;
double d = iy * (1.0 + t * t); double d = iy * (1.0 + t * t);
return scm_make_complex ((rx * t + ix) / d, (ix * t - rx) / d); return scm_make_complex ((rx * t + ix) / d, (ix * t - rx) / d);