rbmatlab  1.16.09
 All Classes Namespaces Files Functions Variables Modules Pages
sin_sym.m
1 function Y = sin_sym(X)
2 %function Y = sin_sym(X)
3 %
4 % sine function guaranteeing exact floating-point symmetry
5 % i.e. sin(x) = sin(x+2*pi) = - sin(-x)
6 % i.e. usually we get
7 %
8 % sin(0.1) + sin(0.1+pi) = 4.1633e-17
9 % sin_sym(0.1) + sin_sym(0.1+pi) = 4.1633e-17
10 %
11 % Bernard Haasdonk 5.6.2008
12 
13 % averaging over 4 periods:
14 
15 %generate large lookuptable
16 
17 resolution = 1000;
18 step = pi/resolution;
19 xvals = 0:step:(pi-1e-10);
20 if length(xvals)~=resolution;
21  error('check length of table!!');
22 end;
23 sin_tab = sin(xvals);
24 sin_tab = [sin_tab, 0];
25 sin_tab(1:end) = 0.5*(sin_tab(1:end)+ sin_tab(end:-1:1));
26 
27 % map X to interval [0,pi)
28 X = X(:);
29 n = floor(X/pi);
30 odd_n = mod(n,2); % 0 => no flip => 1 flip
31 X = X - n* pi;
32 I = round(X/step)+1;
33 %Y = sin(X);
34 Y = sin_tab(I);
35 Y = Y(:);
36 
37 %keyboard;
38 
39 %flip sine values
40 %Y = Y.*sgns;
41 fi = find(odd_n);
42 Y(fi) = -Y(fi);
43 
44 return;
45 
46 % old version with averaging, that does not give better results:
47 %Yplus = sin(X) + sin(X+2*pi)+ sin(X-2*pi)+ X(X+4*pi);
48 %Yminus = sin(X-pi) + sin(X-3*pi) + sin(X+pi)+sin(X+3*pi);
49 %Y = (Yplus - Yminus)/6;
50 %return;
51 
52 % TO BE ADJUSTED TO NEW SYNTAX
53 %| \docupdate