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?
numerical-methods numerical-linear-algebra
add a comment |
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?
numerical-methods numerical-linear-algebra
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
add a comment |
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?
numerical-methods numerical-linear-algebra
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
numerical-methods numerical-linear-algebra
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
add a comment |
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
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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