comparison liboctave/CMatrix.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
1437 octave_idx_type nr = rows (); 1437 octave_idx_type nr = rows ();
1438 octave_idx_type nc = cols (); 1438 octave_idx_type nc = cols ();
1439 1439
1440 if (nr == 0 || nc == 0) 1440 if (nr == 0 || nc == 0)
1441 { 1441 {
1442 Complex d[2]; 1442 retval = ComplexDET (1.0, 0);
1443 d[0] = 1.0;
1444 d[1] = 0.0;
1445 retval = ComplexDET (d);
1446 } 1443 }
1447 else 1444 else
1448 { 1445 {
1449 Array<octave_idx_type> ipvt (nr); 1446 Array<octave_idx_type> ipvt (nr);
1450 octave_idx_type *pipvt = ipvt.fortran_vec (); 1447 octave_idx_type *pipvt = ipvt.fortran_vec ();
1498 info = -1; 1495 info = -1;
1499 retval = ComplexDET (); 1496 retval = ComplexDET ();
1500 } 1497 }
1501 else 1498 else
1502 { 1499 {
1503 Complex d[2] = { 1., 0.}; 1500 Complex c = 1.0;
1504 for (octave_idx_type i=0; i<nc; i++) 1501 int e = 0;
1502
1503 for (octave_idx_type i = 0; i < nc; i++)
1505 { 1504 {
1506 if (ipvt(i) != (i+1)) d[0] = -d[0]; 1505 if (ipvt(i) != (i+1))
1507 d[0] = d[0] * atmp(i,i); 1506 c = -c;
1508 if (d[0] == 0.) break; 1507
1509 while (std::abs(d[0]) < 1.) 1508 c *= atmp(i,i);
1509
1510 if (c == 0.0)
1511 break;
1512
1513 while (std::abs(c) < 0.5)
1510 { 1514 {
1511 d[0] = 10. * d[0]; 1515 c *= 2.0;
1512 d[1] = d[1] - 1.0; 1516 e--;
1513 } 1517 }
1514 while (std::abs(d[0]) >= 10.) 1518
1519 while (std::abs(c) >= 2.0)
1515 { 1520 {
1516 d[0] = 0.1 * d[0]; 1521 c /= 2.0;
1517 d[1] = d[1] + 1.0; 1522 e++;
1518 } 1523 }
1519 } 1524 }
1520 retval = ComplexDET (d); 1525
1526 retval = ComplexDET (c, e);
1521 } 1527 }
1522 } 1528 }
1523 } 1529 }
1524 } 1530 }
1525 1531