Numerically robust 2x2 determinant?











up vote
5
down vote

favorite












How can the determinant of a 2x2 matrix
$$
begin{vmatrix}
a & b \
c & d
end{vmatrix}
=
a d - b c
$$

be computed in floating point without suffering unnecessary catastrophic cancellation?



For a challenging case, consider the determinant:



$$
begin{vmatrix}
10^9 & 10^9-1 \
10^9-1 & 10^9-2
end{vmatrix}
=
begin{vmatrix}
1 000 000 000 & 999 999 999 \
999 999 999 & 999 999 998
end{vmatrix}
= -1.
$$



All of the numbers above are exactly representable in IEEE double precision
arithmetic, including the determinant which is exactly $-1$.



But naively computing the determinant as $a b - c d$ in double precision produces $0$:
$$
begin{eqnarray}
a b - c d &=& 10^9 (10^9-2) - (10^9-1)^2 \
&=& (10^{18} - 2*10^9) - (10^{18} - 2*10^9 + 1) \
&=& (10^{18} - 2*10^9) - (10^{18} - 2*10^9) textrm{ (the 1 is lost in rounding)} \
&=& 0
end{eqnarray}
$$



A seemingly reasonable alternative approach might be to reduce
the matrix to triangular form using determinant-preserving row operations;
that is, gaussian elimination
(possibly with some form of row and/or column pivoting),
and then take the product of the diagonal entries in the reduced triangular matrix.



Trying that on the above example, we see that
the upper-left entry $a$, being the entry with maximum magnitude,
is already the optimal pivot, so no row or column permutation is done initially.
So gaussian elimination proceeds to zero out the lower-left entry
by subtracting $c/a=(10^9-1)/10^9$ times the first row from the second row, yielding:
$$
begin{eqnarray}
& &
begin{vmatrix}
10^9 & 10^9-1 \
0 & (10^9-2) - (10^9-1)*(10^9-1)/10^9
end{vmatrix} \
&=&
begin{vmatrix}
10^9 & 10^9-1 \
0 & (10^9-2) - (10^9 - 2 + 10^{-9})
end{vmatrix} \
&=&
begin{vmatrix}
10^9 & 10^9-1 \
0 & (10^9-2) - (10^9-2)
end{vmatrix}
textrm{ (the }10^{-9}textrm{ is lost in rounding)} \
&=&
begin{vmatrix}
10^9 & 10^9-1 \
0 & 0
end{vmatrix} \
&=& 0
end{eqnarray}
$$



So gaussian elimination, too, has failed on this example.



This example can be solved in double precision,
via the following ad-hoc sequence of determinant-preserving row and column operations.
Start with the original matrix:
$$
begin{pmatrix}
10^9 & 10^9-1 \
10^9-1 & 10^9-2
end{pmatrix}
$$

Subtract the first row from the second:
$$
begin{pmatrix}
10^9 & 10^9-1 \
-1 & -1
end{pmatrix}
$$

Subtract the second column from the first:
$$
begin{pmatrix}
1 & 10^9-1 \
0 & -1
end{pmatrix}
$$

Then the determinant can be read off as $(1*-1) - (10^9-1)*0 = -1$,
which is the correct answer.



Is there a general robust method?










share|cite|improve this question






















  • You can use double-double arithmetic (en.wikipedia.org/wiki/…) or look for error-free transformations (for determinants). See also researchgate.net/publication/…
    – gammatester
    Nov 24 at 8:35

















up vote
5
down vote

favorite












How can the determinant of a 2x2 matrix
$$
begin{vmatrix}
a & b \
c & d
end{vmatrix}
=
a d - b c
$$

be computed in floating point without suffering unnecessary catastrophic cancellation?



For a challenging case, consider the determinant:



$$
begin{vmatrix}
10^9 & 10^9-1 \
10^9-1 & 10^9-2
end{vmatrix}
=
begin{vmatrix}
1 000 000 000 & 999 999 999 \
999 999 999 & 999 999 998
end{vmatrix}
= -1.
$$



All of the numbers above are exactly representable in IEEE double precision
arithmetic, including the determinant which is exactly $-1$.



But naively computing the determinant as $a b - c d$ in double precision produces $0$:
$$
begin{eqnarray}
a b - c d &=& 10^9 (10^9-2) - (10^9-1)^2 \
&=& (10^{18} - 2*10^9) - (10^{18} - 2*10^9 + 1) \
&=& (10^{18} - 2*10^9) - (10^{18} - 2*10^9) textrm{ (the 1 is lost in rounding)} \
&=& 0
end{eqnarray}
$$



A seemingly reasonable alternative approach might be to reduce
the matrix to triangular form using determinant-preserving row operations;
that is, gaussian elimination
(possibly with some form of row and/or column pivoting),
and then take the product of the diagonal entries in the reduced triangular matrix.



Trying that on the above example, we see that
the upper-left entry $a$, being the entry with maximum magnitude,
is already the optimal pivot, so no row or column permutation is done initially.
So gaussian elimination proceeds to zero out the lower-left entry
by subtracting $c/a=(10^9-1)/10^9$ times the first row from the second row, yielding:
$$
begin{eqnarray}
& &
begin{vmatrix}
10^9 & 10^9-1 \
0 & (10^9-2) - (10^9-1)*(10^9-1)/10^9
end{vmatrix} \
&=&
begin{vmatrix}
10^9 & 10^9-1 \
0 & (10^9-2) - (10^9 - 2 + 10^{-9})
end{vmatrix} \
&=&
begin{vmatrix}
10^9 & 10^9-1 \
0 & (10^9-2) - (10^9-2)
end{vmatrix}
textrm{ (the }10^{-9}textrm{ is lost in rounding)} \
&=&
begin{vmatrix}
10^9 & 10^9-1 \
0 & 0
end{vmatrix} \
&=& 0
end{eqnarray}
$$



So gaussian elimination, too, has failed on this example.



This example can be solved in double precision,
via the following ad-hoc sequence of determinant-preserving row and column operations.
Start with the original matrix:
$$
begin{pmatrix}
10^9 & 10^9-1 \
10^9-1 & 10^9-2
end{pmatrix}
$$

Subtract the first row from the second:
$$
begin{pmatrix}
10^9 & 10^9-1 \
-1 & -1
end{pmatrix}
$$

Subtract the second column from the first:
$$
begin{pmatrix}
1 & 10^9-1 \
0 & -1
end{pmatrix}
$$

Then the determinant can be read off as $(1*-1) - (10^9-1)*0 = -1$,
which is the correct answer.



Is there a general robust method?










share|cite|improve this question






















  • You can use double-double arithmetic (en.wikipedia.org/wiki/…) or look for error-free transformations (for determinants). See also researchgate.net/publication/…
    – gammatester
    Nov 24 at 8:35















up vote
5
down vote

favorite









up vote
5
down vote

favorite











How can the determinant of a 2x2 matrix
$$
begin{vmatrix}
a & b \
c & d
end{vmatrix}
=
a d - b c
$$

be computed in floating point without suffering unnecessary catastrophic cancellation?



For a challenging case, consider the determinant:



$$
begin{vmatrix}
10^9 & 10^9-1 \
10^9-1 & 10^9-2
end{vmatrix}
=
begin{vmatrix}
1 000 000 000 & 999 999 999 \
999 999 999 & 999 999 998
end{vmatrix}
= -1.
$$



All of the numbers above are exactly representable in IEEE double precision
arithmetic, including the determinant which is exactly $-1$.



But naively computing the determinant as $a b - c d$ in double precision produces $0$:
$$
begin{eqnarray}
a b - c d &=& 10^9 (10^9-2) - (10^9-1)^2 \
&=& (10^{18} - 2*10^9) - (10^{18} - 2*10^9 + 1) \
&=& (10^{18} - 2*10^9) - (10^{18} - 2*10^9) textrm{ (the 1 is lost in rounding)} \
&=& 0
end{eqnarray}
$$



A seemingly reasonable alternative approach might be to reduce
the matrix to triangular form using determinant-preserving row operations;
that is, gaussian elimination
(possibly with some form of row and/or column pivoting),
and then take the product of the diagonal entries in the reduced triangular matrix.



Trying that on the above example, we see that
the upper-left entry $a$, being the entry with maximum magnitude,
is already the optimal pivot, so no row or column permutation is done initially.
So gaussian elimination proceeds to zero out the lower-left entry
by subtracting $c/a=(10^9-1)/10^9$ times the first row from the second row, yielding:
$$
begin{eqnarray}
& &
begin{vmatrix}
10^9 & 10^9-1 \
0 & (10^9-2) - (10^9-1)*(10^9-1)/10^9
end{vmatrix} \
&=&
begin{vmatrix}
10^9 & 10^9-1 \
0 & (10^9-2) - (10^9 - 2 + 10^{-9})
end{vmatrix} \
&=&
begin{vmatrix}
10^9 & 10^9-1 \
0 & (10^9-2) - (10^9-2)
end{vmatrix}
textrm{ (the }10^{-9}textrm{ is lost in rounding)} \
&=&
begin{vmatrix}
10^9 & 10^9-1 \
0 & 0
end{vmatrix} \
&=& 0
end{eqnarray}
$$



So gaussian elimination, too, has failed on this example.



This example can be solved in double precision,
via the following ad-hoc sequence of determinant-preserving row and column operations.
Start with the original matrix:
$$
begin{pmatrix}
10^9 & 10^9-1 \
10^9-1 & 10^9-2
end{pmatrix}
$$

Subtract the first row from the second:
$$
begin{pmatrix}
10^9 & 10^9-1 \
-1 & -1
end{pmatrix}
$$

Subtract the second column from the first:
$$
begin{pmatrix}
1 & 10^9-1 \
0 & -1
end{pmatrix}
$$

Then the determinant can be read off as $(1*-1) - (10^9-1)*0 = -1$,
which is the correct answer.



Is there a general robust method?










share|cite|improve this question













How can the determinant of a 2x2 matrix
$$
begin{vmatrix}
a & b \
c & d
end{vmatrix}
=
a d - b c
$$

be computed in floating point without suffering unnecessary catastrophic cancellation?



For a challenging case, consider the determinant:



$$
begin{vmatrix}
10^9 & 10^9-1 \
10^9-1 & 10^9-2
end{vmatrix}
=
begin{vmatrix}
1 000 000 000 & 999 999 999 \
999 999 999 & 999 999 998
end{vmatrix}
= -1.
$$



All of the numbers above are exactly representable in IEEE double precision
arithmetic, including the determinant which is exactly $-1$.



But naively computing the determinant as $a b - c d$ in double precision produces $0$:
$$
begin{eqnarray}
a b - c d &=& 10^9 (10^9-2) - (10^9-1)^2 \
&=& (10^{18} - 2*10^9) - (10^{18} - 2*10^9 + 1) \
&=& (10^{18} - 2*10^9) - (10^{18} - 2*10^9) textrm{ (the 1 is lost in rounding)} \
&=& 0
end{eqnarray}
$$



A seemingly reasonable alternative approach might be to reduce
the matrix to triangular form using determinant-preserving row operations;
that is, gaussian elimination
(possibly with some form of row and/or column pivoting),
and then take the product of the diagonal entries in the reduced triangular matrix.



Trying that on the above example, we see that
the upper-left entry $a$, being the entry with maximum magnitude,
is already the optimal pivot, so no row or column permutation is done initially.
So gaussian elimination proceeds to zero out the lower-left entry
by subtracting $c/a=(10^9-1)/10^9$ times the first row from the second row, yielding:
$$
begin{eqnarray}
& &
begin{vmatrix}
10^9 & 10^9-1 \
0 & (10^9-2) - (10^9-1)*(10^9-1)/10^9
end{vmatrix} \
&=&
begin{vmatrix}
10^9 & 10^9-1 \
0 & (10^9-2) - (10^9 - 2 + 10^{-9})
end{vmatrix} \
&=&
begin{vmatrix}
10^9 & 10^9-1 \
0 & (10^9-2) - (10^9-2)
end{vmatrix}
textrm{ (the }10^{-9}textrm{ is lost in rounding)} \
&=&
begin{vmatrix}
10^9 & 10^9-1 \
0 & 0
end{vmatrix} \
&=& 0
end{eqnarray}
$$



So gaussian elimination, too, has failed on this example.



This example can be solved in double precision,
via the following ad-hoc sequence of determinant-preserving row and column operations.
Start with the original matrix:
$$
begin{pmatrix}
10^9 & 10^9-1 \
10^9-1 & 10^9-2
end{pmatrix}
$$

Subtract the first row from the second:
$$
begin{pmatrix}
10^9 & 10^9-1 \
-1 & -1
end{pmatrix}
$$

Subtract the second column from the first:
$$
begin{pmatrix}
1 & 10^9-1 \
0 & -1
end{pmatrix}
$$

Then the determinant can be read off as $(1*-1) - (10^9-1)*0 = -1$,
which is the correct answer.



Is there a general robust method?







numerical-methods numerical-linear-algebra






share|cite|improve this question













share|cite|improve this question











share|cite|improve this question




share|cite|improve this question










asked Nov 24 at 5:33









Don Hatch

271112




271112












  • You can use double-double arithmetic (en.wikipedia.org/wiki/…) or look for error-free transformations (for determinants). See also researchgate.net/publication/…
    – gammatester
    Nov 24 at 8:35




















  • You can use double-double arithmetic (en.wikipedia.org/wiki/…) or look for error-free transformations (for determinants). See also researchgate.net/publication/…
    – gammatester
    Nov 24 at 8:35


















You can use double-double arithmetic (en.wikipedia.org/wiki/…) or look for error-free transformations (for determinants). See also researchgate.net/publication/…
– gammatester
Nov 24 at 8:35






You can use double-double arithmetic (en.wikipedia.org/wiki/…) or look for error-free transformations (for determinants). See also researchgate.net/publication/…
– gammatester
Nov 24 at 8:35

















active

oldest

votes











Your Answer





StackExchange.ifUsing("editor", function () {
return StackExchange.using("mathjaxEditing", function () {
StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["$", "$"], ["\\(","\\)"]]);
});
});
}, "mathjax-editing");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "69"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
noCode: true, onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmath.stackexchange.com%2fquestions%2f3011226%2fnumerically-robust-2x2-determinant%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown






























active

oldest

votes













active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Mathematics Stack Exchange!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


Use MathJax to format equations. MathJax reference.


To learn more, see our tips on writing great answers.





Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


Please pay close attention to the following guidance:


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmath.stackexchange.com%2fquestions%2f3011226%2fnumerically-robust-2x2-determinant%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

How do I know what Microsoft account the skydrive app is syncing to?

When does type information flow backwards in C++?

Grease: Live!