Mercurial > octave-nkf
annotate src/DLD-FUNCTIONS/gcd.cc @ 7948:af10baa63915 ss-3-1-50
3.1.50 snapshot
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Fri, 18 Jul 2008 17:42:48 -0400 |
parents | a41df65f3f00 |
children | 25bc2d31e1bf |
rev | line source |
---|---|
4864 | 1 /* |
2 | |
7017 | 3 Copyright (C) 2004, 2005, 2006, 2007 David Bateman |
4864 | 4 |
7016 | 5 This file is part of Octave. |
4864 | 6 |
7016 | 7 Octave is free software; you can redistribute it and/or modify it |
8 under the terms of the GNU General Public License as published by the | |
9 Free Software Foundation; either version 3 of the License, or (at your | |
10 option) any later version. | |
11 | |
12 Octave is distributed in the hope that it will be useful, but WITHOUT | |
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
4864 | 16 |
17 You should have received a copy of the GNU General Public License | |
7016 | 18 along with Octave; see the file COPYING. If not, see |
19 <http://www.gnu.org/licenses/>. | |
4864 | 20 |
21 */ | |
22 | |
23 #ifdef HAVE_CONFIG_H | |
24 #include <config.h> | |
25 #endif | |
26 | |
27 #include "dNDArray.h" | |
28 #include "CNDArray.h" | |
7815
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
29 #include "fNDArray.h" |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
30 #include "fCNDArray.h" |
4864 | 31 #include "lo-mappers.h" |
32 | |
33 #include "defun-dld.h" | |
34 #include "error.h" | |
35 #include "oct-obj.h" | |
36 | |
5775 | 37 // FIXME -- should probably handle Inf, NaN. |
4864 | 38 |
39 static inline bool | |
40 is_integer_value (double x) | |
41 { | |
5985 | 42 return x == std::floor (x); |
4864 | 43 } |
44 | |
7815
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
45 static inline bool |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
46 is_integer_value (float x) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
47 { |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
48 return x == std::floor (x); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
49 } |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
50 |
4864 | 51 DEFUN_DLD (gcd, args, nargout, |
52 "-*- texinfo -*-\n\ | |
6547 | 53 @deftypefn {Loadable Function} {@var{g} =} gcd (@var{a1}, @dots{})\n\ |
54 @deftypefnx {Loadable Function} {[@var{g}, @var{v1}, @dots{}] =} gcd (@var{a1}, @dots{})\n\ | |
4864 | 55 \n\ |
56 If a single argument is given then compute the greatest common divisor of\n\ | |
57 the elements of this argument. Otherwise if more than one argument is\n\ | |
58 given all arguments must be the same size or scalar. In this case the\n\ | |
59 greatest common divisor is calculated for element individually. All\n\ | |
60 elements must be integers. For example,\n\ | |
61 \n\ | |
62 @example\n\ | |
63 @group\n\ | |
64 gcd ([15, 20])\n\ | |
65 @result{} 5\n\ | |
66 @end group\n\ | |
67 @end example\n\ | |
68 \n\ | |
69 @noindent\n\ | |
70 and\n\ | |
71 \n\ | |
72 @example\n\ | |
73 @group\n\ | |
74 gcd ([15, 9], [20 18])\n\ | |
75 @result{} 5 9\n\ | |
76 @end group\n\ | |
77 @end example\n\ | |
78 \n\ | |
79 Optional return arguments @var{v1}, etc, contain integer vectors such\n\ | |
80 that,\n\ | |
81 \n\ | |
82 @ifinfo\n\ | |
83 @example\n\ | |
6547 | 84 @var{g} = @var{v1} .* @var{a1} + @var{v2} .* @var{a2} + @dots{}\n\ |
4864 | 85 @end example\n\ |
86 @end ifinfo\n\ | |
87 @iftex\n\ | |
88 @tex\n\ | |
89 $g = v_1 a_1 + v_2 a_2 + \\cdots$\n\ | |
90 @end tex\n\ | |
91 @end iftex\n\ | |
92 \n\ | |
7001 | 93 For backward compatibility with previous versions of this function, when\n\ |
94 all arguments are scalar, a single return argument @var{v1} containing\n\ | |
6547 | 95 all of the values of @var{v1}, @dots{} is acceptable.\n\ |
5642 | 96 @seealso{lcm, min, max, ceil, floor}\n\ |
97 @end deftypefn") | |
4864 | 98 { |
99 octave_value_list retval; | |
100 | |
101 int nargin = args.length (); | |
102 | |
103 if (nargin == 0) | |
104 { | |
5823 | 105 print_usage (); |
4864 | 106 return retval; |
107 } | |
108 | |
109 bool all_args_scalar = true; | |
7815
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
110 bool any_single = false; |
4864 | 111 |
112 dim_vector dv(1); | |
113 | |
114 for (int i = 0; i < nargin; i++) | |
115 { | |
116 if (! args(i).is_scalar_type ()) | |
117 { | |
118 if (! args(i).is_matrix_type ()) | |
119 { | |
120 error ("gcd: invalid argument type"); | |
121 return retval; | |
122 } | |
123 | |
124 if (all_args_scalar) | |
125 { | |
126 all_args_scalar = false; | |
127 dv = args(i).dims (); | |
128 } | |
129 else | |
130 { | |
131 if (dv != args(i).dims ()) | |
132 { | |
133 error ("gcd: all arguments must be the same size or scalar"); | |
134 return retval; | |
135 } | |
136 } | |
137 } | |
7815
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
138 if (!any_single && args(i).is_single_type ()) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
139 any_single = true; |
4864 | 140 } |
141 | |
7815
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
142 if (any_single) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
143 { |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
144 if (nargin == 1) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
145 { |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
146 FloatNDArray gg = args(0).float_array_value (); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
147 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
148 int nel = dv.numel (); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
149 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
150 FloatNDArray v (dv); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
151 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
152 FloatRowVector x (3); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
153 FloatRowVector y (3); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
154 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
155 float g = std::abs (gg(0)); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
156 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
157 if (! is_integer_value (g)) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
158 { |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
159 error ("gcd: all arguments must be integer"); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
160 return retval; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
161 } |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
162 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
163 v(0) = signum (gg(0)); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
164 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
165 for (int k = 1; k < nel; k++) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
166 { |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
167 x(0) = g; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
168 x(1) = 1; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
169 x(2) = 0; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
170 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
171 y(0) = std::abs (gg(k)); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
172 y(1) = 0; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
173 y(2) = 1; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
174 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
175 if (! is_integer_value (y(0))) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
176 { |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
177 error ("gcd: all arguments must be integer"); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
178 return retval; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
179 } |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
180 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
181 while (y(0) > 0) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
182 { |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
183 FloatRowVector r = x - y * std::floor (x(0) / y(0)); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
184 x = y; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
185 y = r; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
186 } |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
187 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
188 g = x(0); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
189 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
190 for (int i = 0; i < k; i++) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
191 v(i) *= x(1); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
192 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
193 v(k) = x(2) * signum (gg(k)); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
194 } |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
195 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
196 retval (1) = v; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
197 retval (0) = g; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
198 } |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
199 else if (all_args_scalar && nargout < 3) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
200 { |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
201 float g = args(0).float_value (); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
202 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
203 if (error_state || ! is_integer_value (g)) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
204 { |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
205 error ("gcd: all arguments must be integer"); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
206 return retval; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
207 } |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
208 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
209 FloatRowVector v (nargin, 0); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
210 FloatRowVector x (3); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
211 FloatRowVector y (3); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
212 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
213 v(0) = signum (g); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
214 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
215 g = std::abs(g); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
216 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
217 for (int k = 1; k < nargin; k++) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
218 { |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
219 x(0) = g; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
220 x(1) = 1; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
221 x(2) = 0; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
222 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
223 y(0) = args(k).float_value (); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
224 y(1) = 0; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
225 y(2) = 1; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
226 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
227 float sgn = signum (y(0)); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
228 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
229 y(0) = std::abs (y(0)); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
230 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
231 if (error_state || ! is_integer_value (g)) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
232 { |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
233 error ("gcd: all arguments must be integer"); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
234 return retval; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
235 } |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
236 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
237 while (y(0) > 0) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
238 { |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
239 FloatRowVector r = x - y * std::floor (x(0) / y(0)); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
240 x = y; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
241 y = r; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
242 } |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
243 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
244 g = x(0); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
245 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
246 for (int i = 0; i < k; i++) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
247 v(i) *= x(1); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
248 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
249 v(k) = x(2) * sgn; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
250 } |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
251 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
252 retval (1) = v; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
253 retval (0) = g; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
254 } |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
255 else |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
256 { |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
257 // FIXME -- we need to handle a possible mixture of scalar and |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
258 // array values here. |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
259 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
260 FloatNDArray g = args(0).float_array_value (); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
261 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
262 OCTAVE_LOCAL_BUFFER (FloatNDArray, v, nargin); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
263 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
264 int nel = dv.numel (); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
265 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
266 v[0].resize(dv); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
267 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
268 for (int i = 0; i < nel; i++) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
269 { |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
270 v[0](i) = signum (g(i)); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
271 g(i) = std::abs (g(i)); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
272 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
273 if (! is_integer_value (g(i))) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
274 { |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
275 error ("gcd: all arguments must be integer"); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
276 return retval; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
277 } |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
278 } |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
279 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
280 FloatRowVector x (3); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
281 FloatRowVector y (3); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
282 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
283 for (int k = 1; k < nargin; k++) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
284 { |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
285 FloatNDArray gnew = args(k).float_array_value (); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
286 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
287 v[k].resize(dv); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
288 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
289 for (int n = 0; n < nel; n++) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
290 { |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
291 x(0) = g(n); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
292 x(1) = 1; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
293 x(2) = 0; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
294 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
295 y(0) = std::abs (gnew(n)); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
296 y(1) = 0; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
297 y(2) = 1; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
298 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
299 if (! is_integer_value (y(0))) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
300 { |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
301 error ("gcd: all arguments must be integer"); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
302 return retval; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
303 } |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
304 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
305 while (y(0) > 0) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
306 { |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
307 FloatRowVector r = x - y * std::floor (x(0) / y(0)); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
308 x = y; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
309 y = r; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
310 } |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
311 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
312 g(n) = x(0); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
313 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
314 for (int i = 0; i < k; i++) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
315 v[i](n) *= x(1); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
316 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
317 v[k](n) = x(2) * signum (gnew(n)); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
318 } |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
319 } |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
320 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
321 for (int k = 0; k < nargin; k++) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
322 retval(1+k) = v[k]; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
323 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
324 retval (0) = g; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
325 } |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
326 } |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
327 else if (nargin == 1) |
4864 | 328 { |
329 NDArray gg = args(0).array_value (); | |
330 | |
331 int nel = dv.numel (); | |
332 | |
333 NDArray v (dv); | |
334 | |
335 RowVector x (3); | |
336 RowVector y (3); | |
337 | |
338 double g = std::abs (gg(0)); | |
339 | |
340 if (! is_integer_value (g)) | |
341 { | |
342 error ("gcd: all arguments must be integer"); | |
343 return retval; | |
344 } | |
345 | |
346 v(0) = signum (gg(0)); | |
347 | |
348 for (int k = 1; k < nel; k++) | |
349 { | |
350 x(0) = g; | |
351 x(1) = 1; | |
352 x(2) = 0; | |
353 | |
354 y(0) = std::abs (gg(k)); | |
355 y(1) = 0; | |
356 y(2) = 1; | |
357 | |
358 if (! is_integer_value (y(0))) | |
359 { | |
360 error ("gcd: all arguments must be integer"); | |
361 return retval; | |
362 } | |
363 | |
364 while (y(0) > 0) | |
365 { | |
5985 | 366 RowVector r = x - y * std::floor (x(0) / y(0)); |
4864 | 367 x = y; |
368 y = r; | |
369 } | |
370 | |
371 g = x(0); | |
372 | |
373 for (int i = 0; i < k; i++) | |
374 v(i) *= x(1); | |
375 | |
376 v(k) = x(2) * signum (gg(k)); | |
377 } | |
378 | |
379 retval (1) = v; | |
380 retval (0) = g; | |
381 } | |
382 else if (all_args_scalar && nargout < 3) | |
383 { | |
5985 | 384 double g = args(0).double_value (); |
4864 | 385 |
5985 | 386 if (error_state || ! is_integer_value (g)) |
4864 | 387 { |
388 error ("gcd: all arguments must be integer"); | |
389 return retval; | |
390 } | |
391 | |
392 RowVector v (nargin, 0); | |
393 RowVector x (3); | |
394 RowVector y (3); | |
395 | |
396 v(0) = signum (g); | |
397 | |
398 g = std::abs(g); | |
399 | |
400 for (int k = 1; k < nargin; k++) | |
401 { | |
402 x(0) = g; | |
403 x(1) = 1; | |
404 x(2) = 0; | |
405 | |
5985 | 406 y(0) = args(k).double_value (); |
4864 | 407 y(1) = 0; |
408 y(2) = 1; | |
409 | |
410 double sgn = signum (y(0)); | |
411 | |
412 y(0) = std::abs (y(0)); | |
413 | |
5985 | 414 if (error_state || ! is_integer_value (g)) |
4864 | 415 { |
416 error ("gcd: all arguments must be integer"); | |
417 return retval; | |
418 } | |
419 | |
420 while (y(0) > 0) | |
421 { | |
5985 | 422 RowVector r = x - y * std::floor (x(0) / y(0)); |
4864 | 423 x = y; |
424 y = r; | |
425 } | |
426 | |
427 g = x(0); | |
428 | |
429 for (int i = 0; i < k; i++) | |
430 v(i) *= x(1); | |
431 | |
432 v(k) = x(2) * sgn; | |
433 } | |
434 | |
435 retval (1) = v; | |
436 retval (0) = g; | |
437 } | |
438 else | |
439 { | |
5964 | 440 // FIXME -- we need to handle a possible mixture of scalar and |
441 // array values here. | |
442 | |
4864 | 443 NDArray g = args(0).array_value (); |
5275 | 444 |
445 OCTAVE_LOCAL_BUFFER (NDArray, v, nargin); | |
4864 | 446 |
447 int nel = dv.numel (); | |
448 | |
449 v[0].resize(dv); | |
450 | |
451 for (int i = 0; i < nel; i++) | |
452 { | |
453 v[0](i) = signum (g(i)); | |
454 g(i) = std::abs (g(i)); | |
455 | |
456 if (! is_integer_value (g(i))) | |
457 { | |
458 error ("gcd: all arguments must be integer"); | |
459 return retval; | |
460 } | |
461 } | |
462 | |
463 RowVector x (3); | |
464 RowVector y (3); | |
465 | |
466 for (int k = 1; k < nargin; k++) | |
467 { | |
468 NDArray gnew = args(k).array_value (); | |
469 | |
470 v[k].resize(dv); | |
471 | |
472 for (int n = 0; n < nel; n++) | |
473 { | |
474 x(0) = g(n); | |
475 x(1) = 1; | |
476 x(2) = 0; | |
477 | |
478 y(0) = std::abs (gnew(n)); | |
479 y(1) = 0; | |
480 y(2) = 1; | |
481 | |
482 if (! is_integer_value (y(0))) | |
483 { | |
484 error ("gcd: all arguments must be integer"); | |
485 return retval; | |
486 } | |
487 | |
488 while (y(0) > 0) | |
489 { | |
5985 | 490 RowVector r = x - y * std::floor (x(0) / y(0)); |
4864 | 491 x = y; |
492 y = r; | |
493 } | |
494 | |
495 g(n) = x(0); | |
496 | |
497 for (int i = 0; i < k; i++) | |
498 v[i](n) *= x(1); | |
499 | |
500 v[k](n) = x(2) * signum (gnew(n)); | |
501 } | |
502 } | |
503 | |
504 for (int k = 0; k < nargin; k++) | |
505 retval(1+k) = v[k]; | |
506 | |
507 retval (0) = g; | |
508 } | |
509 | |
510 return retval; | |
511 } | |
512 | |
513 /* | |
7815
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
514 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
515 %!assert(gcd (200, 300, 50, 35), gcd ([200, 300, 50, 35])) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
516 %!assert(gcd ([200, 300, 50, 35]), 5); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
517 %!assert(gcd (single(200), single(300), single(50), single(35)), gcd (single([200, 300, 50, 35]))) |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
518 %!assert(gcd (single([200, 300, 50, 35])), single(5)); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
519 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
520 %!error <Invalid call to gcd.*> gcd (); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
521 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
522 %!test |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
523 %! s.a = 1; |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
524 %! fail("gcd (s)"); |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
525 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
526 */ |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
527 |
a41df65f3f00
Add some single precision test code and fix resulting bugs
David Bateman <dbateman@free.fr>
parents:
7017
diff
changeset
|
528 /* |
4864 | 529 ;;; Local Variables: *** |
530 ;;; mode: C++ *** | |
531 ;;; End: *** | |
532 */ |