interesting case where CAS computation makes a large numerical difference




Interesting article on Cleve's corner today:

http://blogs.mathworks.com/cleve/

On floating points issue and his analysis why it happened.

But wanted to show here that doing the same thing using a CAS
removed the problem (as would be expected, nothing surprising,
since using pure integers). Ofcourse one can argue about speed
and performance in real large numerical problems and all of this.

But I just thought some here might like to see it.

It is finding the Determinant of 2 by 2 matrix of integers.
The correct answer is 1.

I tried the example shown on some software I have, here is
the result. I run in on matlab 2112a,matlab 2112a/symbolic,octave,
Mathematica,Maple:

---- matlab 2112a --------------
EDU>> X = [ 63245986, 102334155
102334155, 165580141];

EDU>> det(X)

1.5249

---- matlab 2112a/Symbolic -------------
EDU>> syms X
EDU>> X=sym([ 63245986, 102334155;102334155, 165580141])
[ 63245986, 102334155]
[ 102334155, 165580141]
EDU>> det(X)
1
----- GNU Octave, version 3.2.4 on Linux -------
octave:3> X
X =
63245986 102334155
102334155 165580141

octave:4> det(X)
ans = 0.99950

---- Mathematica 8.04------
Clear["Global`*"];
a=63245986; b=102334155; c=102334155;d=165580141;
mat={{a,b},{ c,d}};
Det[mat]

Out[25]= 1

--------Maple 14-----------

with(LinearAlgebra):
M:=Matrix([[63245986,102334155],[102334155,165580141]]);
[ 63245986 102334155]
M := [ ]
[102334155 165580141]

Determinant(M);
1
----------------------------

But before we go celebrate, justed wanted to point that even the
CAS programs do not generate 1 when the numbers are made to be
floating points. Interesting also to see now the results:

---- Mathematica 8.04------
Clear["Global`*"];
a=63245986.;b=102334155.;c=102334155.;d=165580141.;
mat={{a,b},{c,d}};
Det[mat]

Out[22]= 1.5249

--------Maple 14-----------

with(LinearAlgebra):
M:=Matrix([[63245986.0,102334155.0],[102334155.0,165580141.0]]);
[ 8 9]
[0.632459860 10 0.1023341550 10 ]
M := [ ]
[ 9 9]
[0.1023341550 10 0.1655801410 10 ]

Determinant(M);
0.

---------------------------

Mathematica result now agrees with Matlab's. I am not sure
why Maple gives zero. May be I need to use an option somewhere
for the Matrix construtor. Not a Maple expert.

I guess it is true then that God made the integers and the
rest is the work of man :)

--Nasser

.