comparison liboctave/dMatrix.cc @ 5634:4b45b2bcda89

[project @ 2006-03-02 03:40:00 by jwe]
author jwe
date Thu, 02 Mar 2006 03:40:01 +0000
parents 25c8956d2204
children 34cda7d94c08
comparison
equal deleted inserted replaced
5633:92f8b2723c8c 5634:4b45b2bcda89
1100 octave_idx_type nr = rows (); 1100 octave_idx_type nr = rows ();
1101 octave_idx_type nc = cols (); 1101 octave_idx_type nc = cols ();
1102 1102
1103 if (nr == 0 || nc == 0) 1103 if (nr == 0 || nc == 0)
1104 { 1104 {
1105 double d[2]; 1105 retval = DET (1.0, 0);
1106 d[0] = 1.0;
1107 d[1] = 0.0;
1108 retval = DET (d);
1109 } 1106 }
1110 else 1107 else
1111 { 1108 {
1112 Array<octave_idx_type> ipvt (nr); 1109 Array<octave_idx_type> ipvt (nr);
1113 octave_idx_type *pipvt = ipvt.fortran_vec (); 1110 octave_idx_type *pipvt = ipvt.fortran_vec ();
1161 info = -1; 1158 info = -1;
1162 retval = DET (); 1159 retval = DET ();
1163 } 1160 }
1164 else 1161 else
1165 { 1162 {
1166 double d[2] = { 1., 0.}; 1163 double c = 1.0;
1167 for (octave_idx_type i=0; i<nc; i++) 1164 int e = 0;
1165
1166 for (octave_idx_type i = 0; i < nc; i++)
1168 { 1167 {
1169 if (ipvt(i) != (i+1)) d[0] = -d[0]; 1168 if (ipvt(i) != (i+1))
1170 d[0] *= atmp(i,i); 1169 c = -c;
1171 if (d[0] == 0.) break; 1170
1172 while (fabs(d[0]) < 1.) 1171 c *= atmp(i,i);
1172
1173 if (c == 0.0)
1174 break;
1175
1176 while (fabs (c) < 0.5)
1173 { 1177 {
1174 d[0] = 10. * d[0]; 1178 c *= 2.0;
1175 d[1] = d[1] - 1.0; 1179 e--;
1176 } 1180 }
1177 while (fabs(d[0]) >= 10.) 1181
1182 while (fabs (c) >= 2.0)
1178 { 1183 {
1179 d[0] = 0.1 * d[0]; 1184 c /= 2.0;
1180 d[1] = d[1] + 1.0; 1185 e++;
1181 } 1186 }
1182 } 1187 }
1183 retval = DET (d); 1188
1189 retval = DET (c, e);
1184 } 1190 }
1185 } 1191 }
1186 } 1192 }
1187 } 1193 }
1188 1194