2014-06-03 3:34 GMT-04:00 Dirk Schulze <dschu...@adobe.com>: > > On Jun 2, 2014, at 12:11 AM, Benoit Jacob <jacob.benoi...@gmail.com> > wrote: > > > Objection #6: > > > > The determinant() method, being in this API the only easy way to get > > something that looks roughly like a measure of invertibility, will > probably > > be (mis-)used as a measure of invertibility. So I'm quite confident that > it > > has a strong mis-use case. Does it have a strong good use case? Does it > > outweigh that? Note that if the intent is precisely to offer some kind of > > measure of invertibility, then that is yet another thing that would be > best > > done with a singular values decomposition (along with solving, and with > > computing a polar decomposition, useful for interpolating matrices), by > > returning the ratio between the lowest and the highest singular value. > > Looking at use cases, then determinant() is indeed often used for: > > * Checking if a matrix is invertible. > * Part of actually inverting the matrix. > * Part of some decomposing algorithms as the one in CSS Transforms. > > I should note that the determinant is the most common way to check for > invertibility of a matrix and part of actually inverting the matrix. Even > Cairo Graphics, Skia and Gecko’s representation of matrix3x3 do use the > determinant for these operations. >
I didn't say that determinant had no good use case. I said that it had more bad use cases than it had good ones. If its only use case if checking whether the cofactors formula will succeed in computing the inverse, then make that part of the inversion API so you don't compute the determinant twice. Here is a good use case of determinant, except it's bad because it computes the determinant twice: if (matrix.determinant() != 0) { // once result = matrix.inverse(); // twice } If that's the only thing we use the determinant for, then we're better served by an API like this, allowing to query success status: var matrixInversionResult = matrix.inverse(); // once if (matrixInversionResult.invertible()) { result = matrixInversionResult.inverse(); } Typical bad uses of the determinant as "measures of invertibility" typically occur in conjunction with people thinking they do the right thing with "fuzzy compares", like this typical bad pattern: if (matrix.determinant() < 1e-6) { return error; } result = matrix.inverse(); Multiple things are wrong here: 1. First, as mentioned above, the determinant is being computed twice here. 2. Second, floating-point scale invariance is broken: floating point computations should generally work for all values across the whole exponent range, which for doubles goes from 1e-300 to 1e+300 roughly. Take the matrix that's 0.01*identity, and suppose we're dealing with 4x4 matrices. The determinant of that matrix is 1e-8, so that matrix is incorrectly treated as non-invertible here. 3. Third, if the primary use for the determinant is invertibility and inversion is implemented by cofactors (as it would be for 4x4 matrices) then in that case only an exact comparison of the determinant to 0 is relevant. That's a case where no fuzzy comparison is meaningful. If one wanted to guard against cancellation-induced imprecision, one would have to look at cofactors themselves, not just at the determinant. In full generality, the determinant is just the volume of the unit cube under the matrix transformation. It is exactly zero if and only if the matrix is singular. That doesn't by itself give any interpretation of other nonzero values of the determinant, not even "very small" ones. For special classes of matrices, things are different. Some classes of matrices have a specific determinant, for example rotations have determinant one, which can be used to do useful things. So in a sufficiently advanced or specialized matrix API, the determinant is useful to expose. DOMMatrix is special in that it is not advanced and not specialized. Benoit > Greetings, > Dirk _______________________________________________ dev-platform mailing list dev-platform@lists.mozilla.org https://lists.mozilla.org/listinfo/dev-platform