--- /dev/null
+## Copyright (C) 2003 Motorola Inc
+## Copyright (C) 2003 David Bateman
+##
+## This program is free software; you can redistribute it and/or modify
+## it under the terms of the GNU General Public License as published by
+## the Free Software Foundation; either version 2 of the License, or
+## (at your option) any later version.
+##
+## This program is distributed in the hope that it will be useful,
+## but WITHOUT ANY WARRANTY; without even the implied warranty of
+## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+## GNU General Public License for more details.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; If not, see <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {} fixedpoint ('help')
+## @deftypefnx {Function File} {} fixedpoint ('info')
+## @deftypefnx {Function File} {} fixedpoint ('info', @var{mod})
+## @deftypefnx {Function File} {} fixedpoint ('test')
+## @deftypefnx {Function File} {} fixedpoint ('test', @var{mod})
+##
+## Manual and test code for the Octave Fixed Point toolbox. There are
+## 5 possible ways to call this function.
+##
+## @table @code
+## @item fixedpoint ('help')
+## Display this help message. Called with no arguments, this function also
+## displays this help message
+## @item fixedpoint ('info')
+## Open the Fixed Point toolbox manual
+## @item fixedpoint ('info', @var{mod})
+## Open the Fixed Point toolbox manual at the section specified by
+## @var{mod}
+## @item fixedpoint ('test')
+## Run all of the test code for the Fixed Point toolbox.
+## @var{mod}.
+## @end table
+##
+## Valid values for the varibale @var{mod} are
+##
+## @table @asis
+## @item 'basics'
+## The section describing the use of the fixed point toolbox within Octave
+## @item 'programming'
+## The section descrining how to use the fixed-point type with oct-files
+## @item 'example'
+## The section describing an in-depth example of the use of the fixed-point
+## type
+## @item 'reference'
+## The refernce section of all of the specific fixed point operators and
+## functions
+## @end table
+##
+## Please note that this function file should be used as an example of the
+## use of this toolbox.
+## @end deftypefn
+
+function retval = fixedpoint(typ, tests)
+
+ if (nargin < 1)
+ typ = "help";
+ tests = "all";
+ elseif (nargin < 2)
+ tests = "all";
+ endif
+
+ infofile = [fileparts(mfilename('fullpath')),'/doc.info'];
+ n = 10;
+ m = 20;
+ is = 7;
+ ds = 6;
+ vals = [-10,10];
+
+ vers = sscanf(OCTAVE_VERSION, "%i.%i.%i");
+
+ if strcmp(tests,"all")
+ nodename = "Top";
+ elseif strcmp(tests,"basics")
+ nodename = "Basics";
+ elseif strcmp(tests,"programming")
+ nodename = "Programming";
+ elseif strcmp(tests,"example")
+ nodename = "Example";
+ elseif strcmp(tests,"reference")
+ nodename = "Function Reference";
+ else
+ error ("fixedpoint: unrecognized section");
+ endif
+
+ if (strcmp(typ,"help"))
+ help ("fixedpoint");
+ elseif (strcmp(typ,"info"))
+ infopaths = ["."];
+ if (!isempty(char (strsplit (path, ":"))))
+ infopaths =[infopaths; char (strsplit (path, ":"))];
+ endif
+ if (!isempty(char (strsplit (DEFAULT_LOADPATH, ":"))))
+ infopaths =[infopaths; char (strsplit (DEFAULT_LOADPATH, ":"))];
+ endif
+ for i=1:size(infopaths,1)
+ infopath = deblank(infopaths(i,:));
+ len = length(infopath);
+ if (len)
+ if (len > 1 && strcmp(infopath([len-1, len]),"//"))
+ [status, showfile] = system(["find '", infopath(1:len-1), ...
+ "' -name ", infofile]);
+ else
+ [status, showfile] = system(["find '", infopath, "' -name ", ...
+ infofile, " -maxdepth 1"]);
+ endif
+ if (length(showfile))
+ break;
+ endif
+ endif
+ end
+ if (!exist("showfile") || !length(showfile))
+ error("fixedpoint: info file not found");
+ endif
+ if (showfile(length(showfile)) == "\n")
+ showfile = showfile(1:length(showfile)-1);
+ endif
+
+ if (exist("INFO_PROGAM"))
+ [testret, testout] = system(["'", INFO_PROGRAM, "' --version"]);
+ if (testret)
+ error("fixedpoint: info command not found");
+ else
+ system(["'", INFO_PROGRAM, "' --file '", showfile, "' --node '", ...
+ nodename, "'"]);
+ endif
+ else
+ [testret, testout] = system("info --version");
+ if (testret)
+ error("fixedpoint: info command not found");
+ else
+ system(["info --file '", showfile, "' --node '", nodename, "'"]);
+ endif
+ endif
+ elseif (strcmp(typ,"test"))
+ pso = page_screen_output();
+ unwind_protect
+ page_screen_output(0);
+ feps = 1 / 2 ^ ds;
+
+ fprintf("\n<< Fixed Point Load Type >>\n");
+
+ ## Load a fixed point variable to start things off
+ x = fixed(is,ds);
+
+ if (!exist("fixed_point_warn_overflow") || !exist("fixed_point_debug") ||
+ !exist("fixed_point_count_operations") ||
+ !exist("fixed_point_version"))
+ error("Can not find fixed point type")
+ endif
+
+ fprintf(" Found Fixed Point Toolbox (version %s)\n",
+ fixed_point_version);
+
+ fprintf("\n<< Fixed Point Creation >>\n");
+ fprintf(" Scalar Creation: ");
+ zero = fixed(is,ds);
+ if (zero.x != 0.) || (zero.int != is) || (zero.dec != ds)
+ error ("FAILED");
+ endif
+ if (!isscalar(zero) || !ismatrix(zero) || !isfixed(zero) ||
+ !isvector(zero))
+ error ("FAILED");
+ endif
+ if any(zero) || all(zero)
+ error ("FAILED");
+ endif
+ if (size(zero) != [1,1]) || (length(zero) != 1)
+ error ("FAILED");
+ endif
+ zero.int = zero.int+1;
+ zero.dec = zero.dec+1;
+ if (zero.x != 0.) || (zero.int != is+1) || (zero.dec != ds+1)
+ error ("FAILED");
+ endif
+ empty = fixed(is,ds,[]);
+ if (isscalar(empty) || ismatrix(empty) || !isfixed(empty) ||
+ isvector(empty) || !isempty(empty) || isempty(zero))
+ error ("FAILED");
+ endif
+ for i=1:100
+ x = (vals(2)-vals(1))*rand(1,1)+vals(1);
+ a = fixed(is, ds, x);
+ if (abs(a.x - x) > feps) || (a.sign != sign(a.x)) || !isfixed(a)
+ error ("FAILED");
+ endif
+ endfor
+ fprintf("PASSED\n");
+ fprintf(" Matrix Creation: ");
+ zero = fixed(is,ds,zeros(n,n));
+
+ if (any(any(zero.x)) || any(any(zero.int != is)) ||
+ any(any(zero.dec != ds)))
+ error ("FAILED");
+ endif
+ if (isscalar(zero) || !ismatrix(zero) || !isfixed(zero) ||
+ isvector(zero))
+ error ("FAILED");
+ endif
+ if any(any(zero)) || all(all(zero))
+ error ("FAILED");
+ endif
+ if (size(zero) != [n,n])
+ error ("FAILED");
+ endif
+ zero.int = zero.int+1;
+ zero.dec = zero.dec+1;
+ if (any(any(zero.x)) || any(any(zero.int != is+1)) ||
+ any(any(zero.dec != ds+1)))
+ error ("FAILED");
+ endif
+ for i=1:100
+ x = (vals(2)-vals(1))*rand(n,n)+vals(1);
+ a = fixed(is, ds, x);
+ if (any(any(abs(a.x - x) > feps)) || any(any(a.sign != sign(a.x)))
+ || !isfixed(a))
+ error ("FAILED");
+ endif
+ endfor
+ b = freshape(a,n*n,1);
+ if (isscalar(b) || !ismatrix(b) || !isfixed(b) || !isvector(b))
+ error ("FAILED");
+ endif
+ if any(b != a(:))
+ error ("FAILED");
+ endif
+ zero = fixed(is,ds,0);
+ vec = fixed(is,ds,[1:n]);
+ a = fdiag(vec);
+ if (size(a,1) != n || size(a,2) != n)
+ error("FAILED");
+ endif
+ for i=1:n
+ for j=1:n
+ if ((i == j) && (a(i,j) != vec(i)))
+ error("FAILED");
+ elseif ((i != j) && (a(i,j) != zero))
+ error("FAILED");
+ endif
+ end
+ end
+ vec = fdiag(a);
+ if (length(vec) != n)
+ error("FAILED");
+ endif
+ for i=1:n
+ if (a(i,i) != vec(i))
+ error("FAILED");
+ endif
+ end
+ fprintf("PASSED\n");
+ fprintf(" Complex Scalar Creation: ");
+ onei = fixed(is*(1+1i),ds*(1+1i),1+1i);
+ if ((onei.x != 1+1i) || (onei.int != is*(1+1i)) ||
+ (onei.dec != ds*(1+1i)))
+ error ("FAILED");
+ endif
+ if (!isscalar(onei) || !ismatrix(onei) || !isfixed(onei) ||
+ !isvector(onei) || !iscomplex(onei))
+ error ("FAILED");
+ endif
+ if !any(onei) || !all(onei)
+ error ("FAILED");
+ endif
+ if (size(onei) != [1,1]) || (length(onei) != 1)
+ error ("FAILED");
+ endif
+ onei.int = onei.int+1;
+ onei.dec = onei.dec+1;
+ if ((onei.x != 1+1i) || (onei.int != is*(1+1i)+1) ||
+ (onei.dec != ds*(1+1i)+1))
+ error ("FAILED");
+ endif
+ empty = fixed(is*(1+1i),ds*(1+1i),[]);
+ if (isscalar(empty) || ismatrix(empty) || !isfixed(empty) ||
+ isvector(empty) || !isempty(empty) || isempty(onei) ||
+ iscomplex(empty))
+ ## Not complex, since its type is narrowed!!
+ error ("FAILED");
+ endif
+
+ for i=1:100
+ x = (vals(2)-vals(1))*rand(1,1)+vals(1) + ...
+ 1i * (vals(2)-vals(1))*rand(1,1)+vals(1);
+ a = fixed(is, ds, x);
+ if ((abs(real(a.x) - real(x)) > feps) ||
+ (abs(imag(a.x) - imag(x)) > feps) || !isfixed(a))
+ error ("FAILED");
+ endif
+ endfor
+ fprintf("PASSED\n");
+ fprintf(" Complex Matrix Creation: ");
+ onei = fixed(is*(1+1i),ds*(1+1i),ones(n,n)*(1+1i));
+
+ if (any(any(onei.x != 1+1i)) || any(any(onei.int != is*(1+1i))) ||
+ any(any(onei.dec != ds*(1+1i))))
+ error ("FAILED");
+ endif
+ if (isscalar(onei) || !ismatrix(onei) || !isfixed(onei) ||
+ isvector(onei) || !iscomplex(onei))
+ error ("FAILED");
+ endif
+ if !any(any(onei)) || !all(all(onei))
+ error ("FAILED");
+ endif
+ if (size(onei) != [n,n])
+ error ("FAILED");
+ endif
+ onei.int = onei.int+1;
+ onei.dec = onei.dec+1;
+ if (any(any(onei.x != 1+1i)) || any(any(onei.int != is*(1+1i)+1)) ||
+ any(any(onei.dec != ds*(1+1i)+1)))
+ error ("FAILED");
+ endif
+ for i=1:100
+ x = (vals(2)-vals(1))*rand(n,n)+vals(1) + ...
+ 1i * (vals(2)-vals(1))*rand(n,n)+vals(1);
+ a = fixed(is, ds, x);
+ if (any(any(abs(real(a.x) - real(x)) > feps)) ||
+ any(any(abs(imag(a.x) - imag(x)) > feps)) || !isfixed(a))
+ error ("FAILED");
+ endif
+ endfor
+ b = freshape(a,n*n,1);
+ if (isscalar(b) || !ismatrix(b) || !isfixed(b) || !isvector(b))
+ error ("FAILED");
+ endif
+ if any(b != a(:))
+ error ("FAILED");
+ endif
+ zero = fixed(is,ds,0);
+ vec = fixed(is*(1+1i),ds*(1+1i),[1:n]*(1+1i));
+ a = fdiag(vec);
+ if (size(a,1) != n || size(a,2) != n)
+ error("FAILED");
+ endif
+ for i=1:n
+ for j=1:n
+ if ((i == j) && (a(i,j) != vec(i)))
+ error("FAILED");
+ elseif ((i != j) && (a(i,j) != zero))
+ error("FAILED");
+ endif
+ end
+ end
+ vec = fdiag(a);
+ if (length(vec) != n)
+ error("FAILED");
+ endif
+ for i=1:n
+ if (a(i,i) != vec(i))
+ error("FAILED");
+ endif
+ end
+ fprintf("PASSED\n");
+ fprintf(" Indexed Access of Scalars: ");
+ a = fixed(is,ds,1);
+ a(2) = fixed(is,ds,2);
+ if (!isvector(a) || !isfixed(a))
+ error("FAILED");
+ endif
+ a = fixed(is,ds,1);
+ a(2) = fixed(is,ds,1i);
+ if (!isvector(a) || !isfixed(a) || !iscomplex(a))
+ error("FAILED");
+ endif
+ a = fixed(is,ds,1);
+ a(1).dec = a(1).dec + 1;
+ if (a.dec != ds+1)
+ error("FAILED");
+ endif
+ a = fixed(is,ds,1i);
+ a(2) = fixed(is,ds,2*1i);
+ if (!isvector(a) || !isfixed(a) || !iscomplex(a))
+ error("FAILED");
+ endif
+ a = fixed(is,ds,1i);
+ a(1).dec = a(1).dec + 1;
+ if (a.dec != ds*(1+1i)+1)
+ error("FAILED");
+ endif
+ fprintf("PASSED\n");
+ fprintf(" Indexed Access of Matrices: ");
+ x = (vals(2)-vals(1))*rand(n,n)+vals(1);
+ a = fixed(is, ds, x);
+ if (any(any(abs(a(1,:).x - x(1,:)) > feps)) || !isfixed(a))
+ error ("FAILED");
+ endif
+ a(1,:).dec = a(1,:).dec + 1;
+ if (a(1,:).dec != ds+1)
+ error("FAILED");
+ endif
+ if (a(2,:).dec != ds)
+ error("FAILED");
+ endif
+ a(1,1) = fixed(is,ds,1i);
+ if (!ismatrix(a) || !isfixed(a) || !iscomplex(a))
+ error("FAILED");
+ endif
+ x = ((vals(2)-vals(1))*rand(n,n)+vals(1) +
+ ((vals(2)-vals(1))*rand(n,n)+vals(1)) * 1i);
+ a = fixed(is, ds, x);
+ if (any(any(abs(real(a(1,:).x) - real(x(1,:))) > feps)) ||
+ any(any(abs(imag(a(1,:).x) - imag(x(1,:))) > feps)) ||
+ !isfixed(a))
+ error ("FAILED");
+ endif
+ a(1,:).dec = a(1,:).dec + 1;
+ if (a(1,:).dec != ds*(1+1i)+1)
+ error("FAILED");
+ endif
+ if (a(2,:).dec != ds*(1+1i))
+ error("FAILED");
+ endif
+ fprintf("PASSED\n");
+
+ fprintf("\n<< Fixed Point Operators >>\n");
+
+ fprintf(" Logical Operators: ");
+ if (_fixedpoint_test_bool_operator("==",is,ds,n) ||
+ _fixedpoint_test_bool_operator("!=",is,ds,n) ||
+ _fixedpoint_test_bool_operator(">",is,ds,n) ||
+ _fixedpoint_test_bool_operator("<",is,ds,n) ||
+ _fixedpoint_test_bool_operator(">=",is,ds,n) ||
+ _fixedpoint_test_bool_operator("<=",is,ds,n))
+ error("FAILED");
+ else
+ fprintf("PASSED\n");
+ endif
+
+ fprintf(" Unary Operators: ");
+ if (_fixedpoint_test_unary_operator("-",is,ds,n,1) ||
+ _fixedpoint_test_unary_operator("+",is,ds,n,1) ||
+ _fixedpoint_test_unary_operator("'",is,ds,n,0) ||
+ _fixedpoint_test_unary_operator(".'",is,ds,n,0))
+ error("FAILED");
+ else
+ fprintf("PASSED\n");
+ endif
+ # This has special meaning for fixed point. Whats the test !!!!
+ # Is the damn operator even correct !!
+ # b = ! a;
+
+ fprintf(" Arithmetic Operators: ");
+ if (_fixedpoint_test_operator("-",is,ds,n,1,1,1) ||
+ _fixedpoint_test_operator("+",is,ds,n,1,1,1) ||
+ _fixedpoint_test_operator(".*",is,ds,n,1,1,1) ||
+ _fixedpoint_test_operator("*",is,ds,n,1,1,1) ||
+ _fixedpoint_test_operator("./",is,ds,n,0,1,1) ||
+
+## Bug in octave 2.1.50 and earlier for el_ldiv in op-cs-s.cc.
+ ((vers(1) > 2 || (vers(1) >= 2 && vers(2) > 1) ||
+ (vers(1) >= 2 && vers(2) >= 1 && vers(3) > 50)) &&
+ _fixedpoint_test_operator(".\\",is,ds,n,0,1,1)) ||
+
+## Rounding errors in complex pow functions make these fail
+## _fixedpoint_test_operator(".**",is,ds,n,0,1,1) ||
+## _fixedpoint_test_operator(".^",is,ds,n,0,1,1)
+
+## Can't do "matrix-by-matrix", as well as above problem
+## _fixedpoint_test_operator("**",is,ds,n,0,1,0) ||
+## _fixedpoint_test_operator("^",is,ds,n,0,1,0) ||
+
+## Can't divide by a matrix as don't have inversion
+ _fixedpoint_test_operator("/",is,ds,n,0,1,0) ||
+ _fixedpoint_test_operator("\\",is,ds,n,0,0,1))
+ error("FAILED");
+ else
+ fprintf("PASSED\n");
+ endif
+
+ fprintf("\n<< Fixed Point Functions >>\n");
+ fprintf(" Rounding Functions: ");
+
+ if (_fixedpoint_test_function("ceil",is,ds,n,0) ||
+ _fixedpoint_test_function("floor",is,ds,n,0) ||
+ _fixedpoint_test_function("round",is,ds,n,0))
+ error("FAILED");
+ else
+ fprintf("PASSED\n");
+ endif
+
+ fprintf(" Matrix Sum and Product Functions: ");
+ if (_fixedpoint_test_function("sum",is,ds,n,0) ||
+ _fixedpoint_test_function("cumsum",is,ds,n,0))
+ error("FAILED");
+ endif
+
+ ## These can easily under- or over-flow. Trick the code by
+ ## foring ds=0, which simplifies the internal calculations,
+ ## effectively limiting the values used to 1 and 0. If you
+ ## can think of a better way, tell me...
+ tmpds = ds;
+ ds = 0;
+ if (_fixedpoint_test_function("sumsq",is,ds,n,feps) ||
+ _fixedpoint_test_function("prod",is,ds,n,feps) ||
+ _fixedpoint_test_function("cumprod",is,ds,n,feps))
+ error("FAILED");
+ else
+ fprintf("PASSED\n");
+ endif
+ ds = tmpds;
+
+ fprintf(" Miscellaneous Functions: ");
+ if (_fixedpoint_test_function("real",is,ds,n,0) ||
+ _fixedpoint_test_function("imag",is,ds,n,0) ||
+ _fixedpoint_test_function("conj",is,ds,n,0) ||
+ _fixedpoint_test_function("arg",is,ds,n,feps) ||
+ _fixedpoint_test_function("angle",is,ds,n,feps) ||
+ _fixedpoint_test_function("abs",is,ds,n,sqrt(2)*feps) ||
+ _fixedpoint_test_function("sqrt",is,ds,n,sqrt(2)*feps))
+ error("FAILED");
+ else
+ fprintf("PASSED\n");
+ endif
+
+ ## These will underflow/overflow, use larger feps that should be
+ ## ok upto ds = 6. Again if you can think of a better way to check!!
+ fprintf(" Exponential Functions: ");
+ if (_fixedpoint_test_function("log",is,ds,n,2*feps,0) ||
+ _fixedpoint_test_function("log10",is,ds,n,20*feps,0) ||
+ _fixedpoint_test_function("exp",is,ds,n,4*feps))
+ error("FAILED");
+ else
+ fprintf("PASSED\n");
+ endif
+
+ ## These will underflow/overflow, use larger feps that should be
+ ## ok upto ds = 6. Again if you can think of a better way to check!!
+ fprintf(" Trigonometric Functions: ");
+ if (_fixedpoint_test_function("sin",is,ds,n,4*feps) ||
+ _fixedpoint_test_function("sinh",is,ds,n,4*feps) ||
+ _fixedpoint_test_function("cos",is,ds,n,4*feps) ||
+ _fixedpoint_test_function("cosh",is,ds,n,4*feps) ||
+ _fixedpoint_test_function("tan",is,ds,n,4*feps) ||
+ _fixedpoint_test_function("tanh",is,ds,n,4*feps))
+ error("FAILED");
+ endif
+
+ ## Special case for fatan2
+ fzero = fixed(is,ds,0);
+ fzeros = fixed(is,ds,zeros(n,1));
+ fone = fixed(is,ds,1);
+ fones = fixed(is,ds,ones(n,1));
+ fpi2 = fixed(is,ds,pi/2);
+ fpi4 = fixed(is,ds,pi/4);
+ if (fatan2(fzero,fzero) != fzero ||
+ fatan2(fzero,fone) != fzero ||
+ fatan2(fone,fzero) != fpi2 ||
+ fatan2(fone,fone) != fpi4 ||
+ any(fatan2(fzeros,fzeros) != fzero) ||
+ any(fatan2(fzeros,fones) != fzero) ||
+ any(fatan2(fones,fzeros) != fpi2) ||
+ any(fatan2(fones,fones) != fpi4))
+ error("FAILED");
+ else
+ fprintf("PASSED\n");
+ endif
+
+ fprintf("\n");
+ unwind_protect_cleanup
+ page_screen_output(pso);
+ end_unwind_protect
+ else
+ usage("fixedpoint: Unknown argument");
+ endif
+endfunction
+
+function ret = _fixedpoint_test_operator(op,is,ds,n,includezero,matrixleft,
+ matrixright)
+ # Properly test all 16 possible combinations of an operator
+
+ ret = 0;
+
+ tzero = 0;
+ tone = 1;
+ tzeros = zeros(n,n);
+ tones = ones(n,n);
+ tczero = 1i;
+ tczeros = 1i*ones(n,n);
+ tcone = 1 + 1i;
+ tcones = (1 + 1i)*ones(n,n);
+
+ fzero = fixed(is,ds,tzero);
+ fone = fixed(is,ds,tone);
+ fzeros = fixed(is,ds,tzeros);
+ fones = fixed(is,ds,tones);
+ fczero = fixed(is,ds,tczero);
+ fczeros = fixed(is,ds,tczeros);
+ fcone = fixed(is,ds,tcone);
+ fcones = fixed(is,ds,tcones);
+
+ # scalar by scalar
+ if (includezero)
+ t1 = eval(["tzero" op "tzero;"]);
+ f1 = eval(["fzero" op "fzero;"]);
+ if (t1 != f1.x)
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tzero" op "tone;"]);
+ f1 = eval(["fzero" op "fone;"]);
+ if (t1 != f1.x)
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tone" op "tzero;"]);
+ f1 = eval(["fone" op "fzero;"]);
+ if (t1 != f1.x)
+ ret = 1;
+ return;
+ endif
+ endif
+ t1 = eval(["tone" op "tone;"]);
+ f1 = eval(["fone" op "fone;"]);
+ if (t1 != f1.x)
+ ret = 1;
+ return;
+ endif
+
+ # scalar by matrix
+ if (matrixright)
+ if (includezero)
+ t1 = eval(["tzero" op "tzeros;"]);
+ f1 = eval(["fzero" op "fzeros;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tzero" op "tones;"]);
+ f1 = eval(["fzero" op "fones;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tone" op "tzeros;"]);
+ f1 = eval(["fone" op "fzeros;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ endif
+ t1 = eval(["tone" op "tones;"]);
+ f1 = eval(["fone" op "fones;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ endif
+
+ # matrix by scalar
+ if (matrixleft)
+ if (includezero)
+ t1 = eval(["tzeros" op "tzero;"]);
+ f1 = eval(["fzeros" op "fzero;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tzeros" op "tone;"]);
+ f1 = eval(["fzeros" op "fone;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tones" op "tzero;"]);
+ f1 = eval(["fones" op "fzero;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ endif
+ t1 = eval(["tones" op "tone;"]);
+ f1 = eval(["fones" op "fone;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ endif
+
+ # matrix by matrix
+ if (matrixleft && matrixright)
+ if (includezero)
+ t1 = eval(["tzeros" op "tzeros;"]);
+ f1 = eval(["fzeros" op "fzeros;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tzeros" op "tones;"]);
+ f1 = eval(["fzeros" op "fones;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tones" op "tzeros;"]);
+ f1 = eval(["fones" op "fzeros;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ endif
+ t1 = eval(["tones" op "tones;"]);
+ f1 = eval(["fones" op "fones;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ endif
+
+ # scalar by complex scalar
+ if (includezero)
+ t1 = eval(["tzero" op "tczero;"]);
+ f1 = eval(["fzero" op "fczero;"]);
+ if (t1 != f1.x)
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tzero" op "tcone;"]);
+ f1 = eval(["fzero" op "fcone;"]);
+ if (t1 != f1.x)
+ ret = 1;
+ return;
+ endif
+ endif
+ t1 = eval(["tone" op "tczero;"]);
+ f1 = eval(["fone" op "fczero;"]);
+ if (t1 != f1.x)
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tone" op "tcone;"]);
+ f1 = eval(["fone" op "fcone;"]);
+ if (t1 != f1.x)
+ ret = 1;
+ return;
+ endif
+
+ # scalar by complex matrix
+ if (matrixright)
+ if (includezero)
+ t1 = eval(["tzero" op "tczeros;"]);
+ f1 = eval(["fzero" op "fczeros;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tzero" op "tcones;"]);
+ f1 = eval(["fzero" op "fcones;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ endif
+ t1 = eval(["tone" op "tczeros;"]);
+ f1 = eval(["fone" op "fczeros;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tone" op "tcones;"]);
+ f1 = eval(["fone" op "fcones;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ endif
+
+ # matrix by complex scalar
+ if (matrixleft)
+ if (includezero)
+ t1 = eval(["tzeros" op "tczero;"]);
+ f1 = eval(["fzeros" op "fczero;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tzeros" op "tcone;"]);
+ f1 = eval(["fzeros" op "fcone;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ endif
+ t1 = eval(["tones" op "tczero;"]);
+ f1 = eval(["fones" op "fczero;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tones" op "tcone;"]);
+ f1 = eval(["fones" op "fcone;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ endif
+
+ # matrix by complex matrix
+ if (matrixleft && matrixright)
+ if (includezero)
+ t1 = eval(["tzeros" op "tczeros;"]);
+ f1 = eval(["fzeros" op "fczeros;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tzeros" op "tcones;"]);
+ f1 = eval(["fzeros" op "fcones;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ endif
+ t1 = eval(["tones" op "tczeros;"]);
+ f1 = eval(["fones" op "fczeros;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tones" op "tcones;"]);
+ f1 = eval(["fones" op "fcones;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ endif
+
+ # complex scalar by scalar
+ if (includezero)
+ t1 = eval(["tczero" op "tzero;"]);
+ f1 = eval(["fczero" op "fzero;"]);
+ if (t1 != f1.x)
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcone" op "tzero;"]);
+ f1 = eval(["fcone" op "fzero;"]);
+ if (t1 != f1.x)
+ ret = 1;
+ return;
+ endif
+ endif
+ t1 = eval(["tczero" op "tone;"]);
+ f1 = eval(["fczero" op "fone;"]);
+ if (t1 != f1.x)
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcone" op "tone;"]);
+ f1 = eval(["fcone" op "fone;"]);
+ if (t1 != f1.x)
+ ret = 1;
+ return;
+ endif
+
+ # complex scalar by matrix
+ if (matrixright)
+ if (includezero)
+ t1 = eval(["tczero" op "tzeros;"]);
+ f1 = eval(["fczero" op "fzeros;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcone" op "tzeros;"]);
+ f1 = eval(["fcone" op "fzeros;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ endif
+ t1 = eval(["tczero" op "tones;"]);
+ f1 = eval(["fczero" op "fones;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcone" op "tones;"]);
+ f1 = eval(["fcone" op "fones;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ endif
+
+ # complex matrix by scalar
+ if (matrixleft)
+ if (includezero)
+ t1 = eval(["tczeros" op "tzero;"]);
+ f1 = eval(["fczeros" op "fzero;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcones" op "tzero;"]);
+ f1 = eval(["fcones" op "fzero;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ endif
+ t1 = eval(["tczeros" op "tone;"]);
+ f1 = eval(["fczeros" op "fone;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcones" op "tone;"]);
+ f1 = eval(["fcones" op "fone;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ endif
+
+ # complex matrix by matrix
+ if (matrixleft && matrixright)
+ if (includezero)
+ t1 = eval(["tczeros" op "tzeros;"]);
+ f1 = eval(["fczeros" op "fzeros;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcones" op "tzeros;"]);
+ f1 = eval(["fcones" op "fzeros;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ endif
+ t1 = eval(["tczeros" op "tones;"]);
+ f1 = eval(["fczeros" op "fones;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcones" op "tones;"]);
+ f1 = eval(["fcones" op "fones;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ endif
+
+ # complex scalar by complex scalar
+ t1 = eval(["tczero" op "tczero;"]);
+ f1 = eval(["fczero" op "fczero;"]);
+ if (t1 != f1.x)
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tczero" op "tcone;"]);
+ f1 = eval(["fczero" op "fcone;"]);
+ if (t1 != f1.x)
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcone" op "tczero;"]);
+ f1 = eval(["fcone" op "fczero;"]);
+ if (t1 != f1.x)
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcone" op "tcone;"]);
+ f1 = eval(["fcone" op "fcone;"]);
+ if (t1 != f1.x)
+ ret = 1;
+ return;
+ endif
+
+ # complex scalar by complex matrix
+ if (matrixright)
+ t1 = eval(["tczero" op "tczeros;"]);
+ f1 = eval(["fczero" op "fczeros;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tczero" op "tcones;"]);
+ f1 = eval(["fczero" op "fcones;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcone" op "tczeros;"]);
+ f1 = eval(["fcone" op "fczeros;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcone" op "tcones;"]);
+ f1 = eval(["fcone" op "fcones;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ endif
+
+ # complex matrix by complex scalar
+ if (matrixleft)
+ t1 = eval(["tczeros" op "tczero;"]);
+ f1 = eval(["fczeros" op "fczero;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tczeros" op "tcone;"]);
+ f1 = eval(["fczeros" op "fcone;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcones" op "tczero;"]);
+ f1 = eval(["fcones" op "fczero;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcones" op "tcone;"]);
+ f1 = eval(["fcones" op "fcone;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ endif
+
+ # complex matrix by complex matrix
+ if (matrixleft && matrixright)
+ t1 = eval(["tczeros" op "tczeros;"]);
+ f1 = eval(["fczeros" op "fczeros;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tczeros" op "tcones;"]);
+ f1 = eval(["fczeros" op "fcones;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcones" op "tczeros;"]);
+ f1 = eval(["fcones" op "fczeros;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcones" op "tcones;"]);
+ f1 = eval(["fcones" op "fcones;"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ endif
+
+endfunction
+
+function ret = _fixedpoint_test_bool_operator(op,is,ds,n)
+ # Properly test all 16 possible combinations of an operator
+
+ ret = 0;
+
+ tzero = 0;
+ tone = 1;
+ tzeros = zeros(n,n);
+ tones = ones(n,n);
+ tczero = 1i;
+ tczeros = 1i*ones(n,n);
+ tcone = 1 + 1i;
+ tcones = (1 + 1i)*ones(n,n);
+
+ fzero = fixed(is,ds,tzero);
+ fone = fixed(is,ds,tone);
+ fzeros = fixed(is,ds,tzeros);
+ fones = fixed(is,ds,tones);
+ fczero = fixed(is,ds,tczero);
+ fczeros = fixed(is,ds,tczeros);
+ fcone = fixed(is,ds,tcone);
+ fcones = fixed(is,ds,tcones);
+
+ # scalar by scalar
+ t1 = eval(["tzero" op "tzero;"]);
+ f1 = eval(["fzero" op "fzero;"]);
+ if (t1 != f1)
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tzero" op "tone;"]);
+ f1 = eval(["fzero" op "fone;"]);
+ if (t1 != f1)
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tone" op "tzero;"]);
+ f1 = eval(["fone" op "fzero;"]);
+ if (t1 != f1)
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tone" op "tone;"]);
+ f1 = eval(["fone" op "fone;"]);
+ if (t1 != f1)
+ ret = 1;
+ return;
+ endif
+
+ # scalar by matrix
+ t1 = eval(["tzero" op "tzeros;"]);
+ f1 = eval(["fzero" op "fzeros;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tzero" op "tones;"]);
+ f1 = eval(["fzero" op "fones;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tone" op "tzeros;"]);
+ f1 = eval(["fone" op "fzeros;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tone" op "tones;"]);
+ f1 = eval(["fone" op "fones;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+
+ # matrix by scalar
+ t1 = eval(["tzeros" op "tzero;"]);
+ f1 = eval(["fzeros" op "fzero;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tzeros" op "tone;"]);
+ f1 = eval(["fzeros" op "fone;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tones" op "tzero;"]);
+ f1 = eval(["fones" op "fzero;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tones" op "tone;"]);
+ f1 = eval(["fones" op "fone;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+
+ # matrix by matrix
+ t1 = eval(["tzeros" op "tzeros;"]);
+ f1 = eval(["fzeros" op "fzeros;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tzeros" op "tones;"]);
+ f1 = eval(["fzeros" op "fones;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tones" op "tzeros;"]);
+ f1 = eval(["fones" op "fzeros;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tones" op "tones;"]);
+ f1 = eval(["fones" op "fones;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+
+
+ # scalar by complex scalar
+ t1 = eval(["tzero" op "tczero;"]);
+ f1 = eval(["fzero" op "fczero;"]);
+ if (t1 != f1)
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tzero" op "tcone;"]);
+ f1 = eval(["fzero" op "fcone;"]);
+ if (t1 != f1)
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tone" op "tczero;"]);
+ f1 = eval(["fone" op "fczero;"]);
+ if (t1 != f1)
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tone" op "tcone;"]);
+ f1 = eval(["fone" op "fcone;"]);
+ if (t1 != f1)
+ ret = 1;
+ return;
+ endif
+
+ # scalar by complex matrix
+ t1 = eval(["tzero" op "tczeros;"]);
+ f1 = eval(["fzero" op "fczeros;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tzero" op "tcones;"]);
+ f1 = eval(["fzero" op "fcones;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tone" op "tczeros;"]);
+ f1 = eval(["fone" op "fczeros;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tone" op "tcones;"]);
+ f1 = eval(["fone" op "fcones;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+
+ # matrix by complex scalar
+ t1 = eval(["tzeros" op "tczero;"]);
+ f1 = eval(["fzeros" op "fczero;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tzeros" op "tcone;"]);
+ f1 = eval(["fzeros" op "fcone;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tones" op "tczero;"]);
+ f1 = eval(["fones" op "fczero;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tones" op "tcone;"]);
+ f1 = eval(["fones" op "fcone;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+
+ # matrix by complex matrix
+ t1 = eval(["tzeros" op "tczeros;"]);
+ f1 = eval(["fzeros" op "fczeros;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tzeros" op "tcones;"]);
+ f1 = eval(["fzeros" op "fcones;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tones" op "tczeros;"]);
+ f1 = eval(["fones" op "fczeros;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tones" op "tcones;"]);
+ f1 = eval(["fones" op "fcones;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+
+ # complex scalar by scalar
+ t1 = eval(["tczero" op "tzero;"]);
+ f1 = eval(["fczero" op "fzero;"]);
+ if (t1 != f1)
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tczero" op "tone;"]);
+ f1 = eval(["fczero" op "fone;"]);
+ if (t1 != f1)
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcone" op "tzero;"]);
+ f1 = eval(["fcone" op "fzero;"]);
+ if (t1 != f1)
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcone" op "tone;"]);
+ f1 = eval(["fcone" op "fone;"]);
+ if (t1 != f1)
+ ret = 1;
+ return;
+ endif
+
+ # complex scalar by matrix
+ t1 = eval(["tczero" op "tzeros;"]);
+ f1 = eval(["fczero" op "fzeros;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tczero" op "tones;"]);
+ f1 = eval(["fczero" op "fones;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcone" op "tzeros;"]);
+ f1 = eval(["fcone" op "fzeros;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcone" op "tones;"]);
+ f1 = eval(["fcone" op "fones;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+
+ # complex matrix by scalar
+ t1 = eval(["tczeros" op "tzero;"]);
+ f1 = eval(["fczeros" op "fzero;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tczeros" op "tone;"]);
+ f1 = eval(["fczeros" op "fone;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcones" op "tzero;"]);
+ f1 = eval(["fcones" op "fzero;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcones" op "tone;"]);
+ f1 = eval(["fcones" op "fone;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+
+ # complex matrix by matrix
+ t1 = eval(["tczeros" op "tzeros;"]);
+ f1 = eval(["fczeros" op "fzeros;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tczeros" op "tones;"]);
+ f1 = eval(["fczeros" op "fones;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcones" op "tzeros;"]);
+ f1 = eval(["fcones" op "fzeros;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcones" op "tones;"]);
+ f1 = eval(["fcones" op "fones;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+
+ # complex scalar by complex scalar
+ t1 = eval(["tczero" op "tczero;"]);
+ f1 = eval(["fczero" op "fczero;"]);
+ if (t1 != f1)
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tczero" op "tcone;"]);
+ f1 = eval(["fczero" op "fcone;"]);
+ if (t1 != f1)
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcone" op "tczero;"]);
+ f1 = eval(["fcone" op "fczero;"]);
+ if (t1 != f1)
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcone" op "tcone;"]);
+ f1 = eval(["fcone" op "fcone;"]);
+ if (t1 != f1)
+ ret = 1;
+ return;
+ endif
+
+ # complex scalar by complex matrix
+ t1 = eval(["tczero" op "tczeros;"]);
+ f1 = eval(["fczero" op "fczeros;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tczero" op "tcones;"]);
+ f1 = eval(["fczero" op "fcones;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcone" op "tczeros;"]);
+ f1 = eval(["fcone" op "fczeros;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcone" op "tcones;"]);
+ f1 = eval(["fcone" op "fcones;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+
+ # complex matrix by complex scalar
+ t1 = eval(["tczeros" op "tczero;"]);
+ f1 = eval(["fczeros" op "fczero;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tczeros" op "tcone;"]);
+ f1 = eval(["fczeros" op "fcone;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcones" op "tczero;"]);
+ f1 = eval(["fcones" op "fczero;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcones" op "tcone;"]);
+ f1 = eval(["fcones" op "fcone;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+
+ # complex matrix by complex matrix
+ t1 = eval(["tczeros" op "tczeros;"]);
+ f1 = eval(["fczeros" op "fczeros;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tczeros" op "tcones;"]);
+ f1 = eval(["fczeros" op "fcones;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcones" op "tczeros;"]);
+ f1 = eval(["fcones" op "fczeros;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+ t1 = eval(["tcones" op "tcones;"]);
+ f1 = eval(["fcones" op "fcones;"]);
+ if any(any(t1 != f1))
+ ret = 1;
+ return;
+ endif
+
+endfunction
+
+function ret = _fixedpoint_test_unary_operator(op,is,ds,n,front)
+ # Properly test all 4 possible combinations of an operator
+
+ ret = 0;
+
+ tzero = 0;
+ tone = 1;
+ tzeros = zeros(n,n);
+ tones = ones(n,n);
+ tczero = 1i;
+ tczeros = 1i*ones(n,n);
+ tcone = 1 + 1i;
+ tcones = (1 + 1i)*ones(n,n);
+
+ fzero = fixed(is,ds,tzero);
+ fone = fixed(is,ds,tone);
+ fzeros = fixed(is,ds,tzeros);
+ fones = fixed(is,ds,tones);
+ fczero = fixed(is,ds,tczero);
+ fczeros = fixed(is,ds,tczeros);
+ fcone = fixed(is,ds,tcone);
+ fcones = fixed(is,ds,tcones);
+
+ if (front)
+ op1 = op;
+ op2 = "";
+ else
+ op1 = "";
+ op2 = op;
+ endif
+
+ # scalar by scalar
+ t1 = eval([ op1 "tzero" op2 ";"]);
+ f1 = eval([ op1 "fzero" op2 ";"]);
+ if (t1 != f1.x)
+ ret = 1;
+ return;
+ endif
+ t1 = eval([ op1 "tone" op2 ";"]);
+ f1 = eval([ op1 "fone" op2 ";"]);
+ if (t1 != f1.x)
+ ret = 1;
+ return;
+ endif
+
+ # matrix
+ t1 = eval([ op1 "tzeros" op2 ";"]);
+ f1 = eval([ op1 "fzeros" op2 ";"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval([ op1 "tones" op2 ";"]);
+ f1 = eval([ op1 "fones" op2 ";"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+
+ # complex scalar
+ t1 = eval([ op1 "tczero" op2 ";"]);
+ f1 = eval([ op1 "fczero" op2 ";"]);
+ if (t1 != f1.x)
+ ret = 1;
+ return;
+ endif
+ t1 = eval([ op1 "tcone" op2 ";"]);
+ f1 = eval([ op1 "fcone" op2 ";"]);
+ if (t1 != f1.x)
+ ret = 1;
+ return;
+ endif
+
+ # complex matrix
+ t1 = eval([ op1 "tczeros" op2 ";"]);
+ f1 = eval([ op1 "fczeros" op2 ";"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+ t1 = eval([ op1 "tcones" op2 ";"]);
+ f1 = eval([ op1 "fcones" op2 ";"]);
+ if any(any(t1 != f1.x))
+ ret = 1;
+ return;
+ endif
+
+endfunction
+
+function ret = _fixedpoint_test_function(func,is,ds,n,eps,includezero)
+ # Properly test all 4 possible combinations of a function
+
+ if (nargin < 6)
+ includezero = 1;
+ endif
+
+ ret = 0;
+ tzero = 0;
+ tone = 1;
+ tzeros = zeros(n,n);
+ tones = ones(n,n);
+ tczero = 1i;
+ tczeros = 1i*ones(n,n);
+ tcone = 1 + 1i;
+ tcones = (1 + 1i)*ones(n,n);
+ if (ds == 0)
+ tval = tone;
+ tvals = tones;
+ tcval = tcone;
+ tcvals = tcones;
+ else
+ tval = 0.5;
+ if (includezero)
+ tvals = ones(n,1) * (round(2^ds * (0:(n-1))/(n-1)) / 2^ds);
+ else
+ tvals = ones(n,1) * (round(2^ds * (1 + 2^(is-1)*(1:(n-1))/(n-1)))
+ / 2^ds);
+ endif
+ tcval = tval * (1+1i);
+ tcvals = tvals * (1+1i);
+ endif
+
+ fzero = fixed(is,ds,tzero);
+ fone = fixed(is,ds,tone);
+ fzeros = fixed(is,ds,tzeros);
+ fones = fixed(is,ds,tones);
+ fczero = fixed(is,ds,tczero);
+ fczeros = fixed(is,ds,tczeros);
+ fcone = fixed(is,ds,tcone);
+ fcones = fixed(is,ds,tcones);
+ fval = fixed(is,ds,tval);
+ fvals = fixed(is,ds,tvals);
+ fcval = fixed(is,ds,tcval);
+ fcvals = fixed(is,ds,tcvals);
+
+ ffunc = [ "f" func];
+
+ # scalar by scalar
+ if (includezero)
+ t1 = eval([ func "(tzero);"]);
+ f1 = eval([ ffunc "(fzero);"]);
+ if (abs(t1 - f1.x) > eps)
+ ret = 1;
+ return;
+ endif
+ endif
+ t1 = eval([ func "(tone);"]);
+ f1 = eval([ ffunc "(fone);"]);
+ if (abs(t1 - f1.x) > eps)
+ ret = 1;
+ return;
+ endif
+ t1 = eval([ func "(tval);"]);
+ f1 = eval([ ffunc "(fval);"]);
+ if (abs(t1 - f1.x) > eps)
+ ret = 1;
+ return;
+ endif
+
+ # matrix
+ if (includezero)
+ t1 = eval([ func "(tzeros);"]);
+ f1 = eval([ ffunc "(fzeros);"]);
+ if any(any(abs(t1 - f1.x) > eps))
+ ret = 1;
+ return;
+ endif
+ endif
+ t1 = eval([ func "(tones);"]);
+ f1 = eval([ ffunc "(fones);"]);
+ if any(any(abs(t1 - f1.x) > eps))
+ ret = 1;
+ return;
+ endif
+ t1 = eval([ func "(tvals);"]);
+ f1 = eval([ ffunc "(fvals);"]);
+ if any(any(abs(t1 - f1.x) > eps))
+ ret = 1;
+ return;
+ endif
+
+ # complex scalar
+ if (includezero)
+ t1 = eval([ func "(tczero);"]);
+ f1 = eval([ ffunc "(fczero);"]);
+ if ((abs(real(t1) - freal(f1).x) > eps) ||
+ (abs(imag(t1) - fimag(f1).x) > eps))
+ ret = 1;
+ return;
+ endif
+ endif
+ t1 = eval([ func "(tcone);"]);
+ f1 = eval([ ffunc "(fcone);"]);
+ if ((abs(real(t1) - freal(f1).x) > eps) || (abs(imag(t1) - fimag(f1).x) > eps))
+ ret = 1;
+ return;
+ endif
+ t1 = eval([ func "(tcval);"]);
+ f1 = eval([ ffunc "(fcval);"]);
+ if ((abs(real(t1) - freal(f1).x) > eps) || (abs(imag(t1) - fimag(f1).x) > eps))
+ ret = 1;
+ return;
+ endif
+
+ # complex matrix
+ if (includezero)
+ t1 = eval([ func "(tczeros);"]);
+ f1 = eval([ ffunc "(fczeros);"]);
+ if (any(any(abs(real(t1) - freal(f1).x) > eps)) ||
+ any(any(abs(imag(t1) - fimag(f1).x) > eps)))
+ ret = 1;
+ return;
+ endif
+ endif
+ t1 = eval([ func "(tcones);"]);
+ f1 = eval([ ffunc "(fcones);"]);
+ if (any(any(abs(real(t1) - freal(f1).x) > eps)) ||
+ any(any(abs(imag(t1) - fimag(f1).x) > eps)))
+ ret = 1;
+ return;
+ endif
+ t1 = eval([ func "(tcvals);"]);
+ f1 = eval([ ffunc "(fcvals);"]);
+ if (any(any(abs(real(t1) - freal(f1).x) > eps)) ||
+ any(any(abs(imag(t1) - fimag(f1).x) > eps)))
+ ret = 1;
+ return;
+ endif
+
+endfunction
+
+%!test
+%! try fixedpoint("test");
+%! catch disp(lasterr()); end
+
+## Local Variables: ***
+## mode: Octave ***
+## End: ***