# HG changeset patch # User jwe # Date 1099586097 0 # Node ID a6755bc45f15474cbd3695015591a8c7c75d6bb3 # Parent 1c4a00f4bfb9b0701fcf1096760684372cd88031 [project @ 2004-11-04 16:34:57 by jwe] diff -r 1c4a00f4bfb9 -r a6755bc45f15 src/ChangeLog --- a/src/ChangeLog Thu Nov 04 16:15:10 2004 +0000 +++ b/src/ChangeLog Thu Nov 04 16:34:57 2004 +0000 @@ -1,8 +1,10 @@ 2004-11-04 John W. Eaton - * DLD-FUNCTIONS/inv.cc (Finv): Declare rcond volatile and check value. + * DLD-FUNCTIONS/inv.cc (Finv): Check rcond value returned from + LAPACK routines, and be careful to avoid optimizing away the + 1+rcond == 1.0 check. * DLD-FUNCTIONS/det.cc (Fdet): Likewise. - + 2004-11-03 John W. Eaton * data.cc (Fsize): Return 1 if requested dimension is larger than diff -r 1c4a00f4bfb9 -r a6755bc45f15 src/DLD-FUNCTIONS/det.cc --- a/src/DLD-FUNCTIONS/det.cc Thu Nov 04 16:15:10 2004 +0000 +++ b/src/DLD-FUNCTIONS/det.cc Thu Nov 04 16:34:57 2004 +0000 @@ -80,20 +80,23 @@ if (! error_state) { int info; - volatile double rcond = 0.0; - + double rcond = 0.0; if (nargout > 1) { DET det = m.determinant (info, rcond); retval(1) = rcond; - retval(0) = ((info == -1 || 1.0 + rcond == 1.0) + volatile double xrcond = rcond; + xrcond += 1.0; + retval(0) = ((info == -1 || xrcond == 1.0) ? 0.0 : det.value ()); } else { DET det = m.determinant (info); - retval(0) = ((info == -1 || 1.0 + rcond == 1.0) + volatile double xrcond = rcond; + xrcond += 1.0; + retval(0) = ((info == -1 || xrcond == 1.0) ? 0.0 : det.value ()); } } @@ -105,19 +108,23 @@ if (! error_state) { int info; - volatile double rcond = 0.0; + double rcond = 0.0; if (nargout > 1) { ComplexDET det = m.determinant (info, rcond); retval(1) = rcond; - retval(0) = ((info == -1 || 1.0 + rcond == 1.0) + volatile double xrcond = rcond; + xrcond += 1.0; + retval(0) = ((info == -1 || xrcond == 1.0) ? Complex (0.0) : det.value ()); } else { ComplexDET det = m.determinant (info); - retval(0) = ((info == -1 | 1.0 + rcond == 1.0) + volatile double xrcond = rcond; + xrcond += 1.0; + retval(0) = ((info == -1 || xrcond == 1.0) ? Complex (0.0) : det.value ()); } } diff -r 1c4a00f4bfb9 -r a6755bc45f15 src/DLD-FUNCTIONS/inv.cc --- a/src/DLD-FUNCTIONS/inv.cc Thu Nov 04 16:15:10 2004 +0000 +++ b/src/DLD-FUNCTIONS/inv.cc Thu Nov 04 16:34:57 2004 +0000 @@ -74,7 +74,7 @@ if (! error_state) { int info; - volatile double rcond = 0.0; + double rcond = 0.0; Matrix result = m.inverse (info, rcond, 1); @@ -83,7 +83,9 @@ retval(0) = result; - if (nargout < 2 && (info == -1 || 1.0 + rcond == 1.0)) + volatile double xrcond = rcond; + xrcond += 1.0; + if (nargout < 2 && (info == -1 || xrcond == 1.0)) warning ("inverse: matrix singular to machine precision,\ rcond = %g", rcond); } @@ -95,7 +97,7 @@ if (! error_state) { int info; - volatile double rcond = 0.0; + double rcond = 0.0; ComplexMatrix result = m.inverse (info, rcond, 1); @@ -104,7 +106,9 @@ retval(0) = result; - if (nargout < 2 && (info == -1 || 1.0 + rcond == 1.0)) + volatile double xrcond = rcond; + xrcond += 1.0; + if (nargout < 2 && (info == -1 || xrcond == 1.0)) warning ("inverse: matrix singular to machine precision,\ rcond = %g", rcond); }