INTLAB version 9をubuntu上のoctaveで使うの続きです。このopenblasはパッケージで入れたものなので、丸めの向きの変更が正しく効くかどうか分かりません。そこで、行列積について、丸めの向きの変更が効いているかどうかテストしてみました。前の記事で入れたubuntuと、ついでにwindowsでも試してみました。
function testmm(n)
disp('testing multiplication...')
flag = 1;
for k=1:n
a=zeros(n);
a(:,k)=ones(n,1)*1/3;
b=zeros(n);
b(k,:)=ones(1,n)*1/3;
c = (rad(intval(a) * b) ~= 0) + 0.0;
if prod(prod(c)) == 0
disp('multiplication error!')
flag = 0;
break
end
end
if flag == 1
disp('multiplication OK!')
end
disp('testing addition...')
flag = 1;
for k=2:n
a=zeros(n);
a(:,1)=ones(n,1);
a(:,k)=ones(n,1)*2^(-27);
b=zeros(n);
b(1,:)=ones(1,n);
b(k,:)=ones(1,n)*2^(-27);
c = (rad(intval(a) * b) ~= 0) + 0.0;
if prod(prod(c)) == 0
disp('addition error!')
flag = 0;
break
end
end
if flag == 1
disp('addition OK!')
end
end
INTLAB version 9の重要性の記事で書いたように、INTLAB version 9を使えばmatlabに頼らずにオープンソースな環境で精度保証付き数値計算を行うことができます。今回、ubuntu 14.04にoctaveをインストールし、その上でINTLABを動かしてみたので、その様子を記録しておきます。
octave:1> format long
octave:2> x=intval(1);
octave:3> y=intval(1);
octave:4> for i=2:10; z=(1+2*y)/(x*y^2); x=y; y=z; i, z, end
i = 2
intval z =
3.00000000000000
i = 3
intval z =
0.77777777777777
i = 4
intval z =
1.40816326530612
i = 5
intval z =
2.47448015122873
i = 6
intval z =
0.68995395922102
i = 7
intval z =
2.0203934747424_
i = 8
intval z =
1.7898074714308_
i = 9
intval z =
0.7075878600520_
i = 10
intval z =
2.69514211796___
octave:5>
octave:1> a=rand(5000);b=rand(5000);
octave:2> tic;a*b;toc
Elapsed time is 3.20024 seconds.
octave:3> tic;intval(a)*b;toc
Elapsed time is 8.66678 seconds.