Albert van der Horst wrote: > I have the following code for calculating the determinant of > a matrix. It works inasfar that it gives the same result as an > octave program on a same matrix. > > / ---------------------------------------------------------------- > > def determinant( mat ): > ''' Return the determinant of the n by n matrix mat > i row j column > Destroys mat ! ''' > #print "getting determinat of", mat > n=len(mat) > nom = 1. > if n == 1: return mat[0][0] > lastr = mat.pop() > jx=-1 > for j in xrange(n): > if lastr[j]: > jx=j > break > if jx==-1: return 0. > result = lastr[jx] > assert(result<>0.) > # Make column jx zero by subtracting a multiple of the last row. > for i in xrange(n-1): > pivot = mat[i][jx] > if 0. == pivot: continue > assert(result<>0.) > nom *= result # Compenstate for multiplying a row. > for j in xrange(n): > mat[i][j] *= result > for j in xrange(n): > mat[i][j] -= pivot*lastr[j] > # Remove colunm jx > for i in xrange(n-1): > x= mat[i].pop(jx) > assert( x==0 ) > > if (n-1+jx)%2<>0: result = -result > det = determinant( mat ) > assert(nom<>0.) > return result*det/nom > > /----------------------------------------- > > Now on some matrices the assert triggers, meaning that nom is zero. > How can that ever happen? mon start out as 1. and gets multiplied > with a number that is asserted to be not zero. > > Any hints appreciated.
Floating point precision is limited: >>> x = 1.0 >>> for i in itertools.count(): ... x *= .1 ... assert x ... Traceback (most recent call last): File "<stdin>", line 3, in <module> AssertionError >>> i 323 -- https://mail.python.org/mailman/listinfo/python-list