GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
mappers.cc
Go to the documentation of this file.
1////////////////////////////////////////////////////////////////////////
2//
3// Copyright (C) 1993-2025 The Octave Project Developers
4//
5// See the file COPYRIGHT.md in the top-level directory of this
6// distribution or <https://octave.org/copyright/>.
7//
8// This file is part of Octave.
9//
10// Octave is free software: you can redistribute it and/or modify it
11// under the terms of the GNU General Public License as published by
12// the Free Software Foundation, either version 3 of the License, or
13// (at your option) any later version.
14//
15// Octave is distributed in the hope that it will be useful, but
16// WITHOUT ANY WARRANTY; without even the implied warranty of
17// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18// GNU General Public License for more details.
19//
20// You should have received a copy of the GNU General Public License
21// along with Octave; see the file COPYING. If not, see
22// <https://www.gnu.org/licenses/>.
23//
24////////////////////////////////////////////////////////////////////////
25
26#if defined (HAVE_CONFIG_H)
27# include "config.h"
28#endif
29
30#include <cctype>
31
32#include "lo-ieee.h"
33#include "lo-specfun.h"
34#include "lo-mappers.h"
35
36#include "defun.h"
37#include "error.h"
38#include "variables.h"
39
41
42DEFUN (abs, args, ,
43 doc: /* -*- texinfo -*-
44@deftypefn {} {@var{z} =} abs (@var{x})
45Compute the magnitude of @var{x}.
46
47The magnitude is defined as
48@tex
49$|z| = \sqrt{x^2 + y^2}$.
50@end tex
51@ifnottex
52|@var{z}| = @code{sqrt (x^2 + y^2)}.
53@end ifnottex
54
55For example:
56
57@example
58@group
59abs (3 + 4i)
60 @result{} 5
61@end group
62@end example
63@seealso{arg}
64@end deftypefn */)
65{
66 if (args.length () != 1)
67 print_usage ();
68
69 return ovl (args(0).abs ());
70}
71
72/*
73%!assert (abs (1), 1)
74%!assert (abs (-3.5), 3.5)
75%!assert (abs (3+4i), 5)
76%!assert (abs (3-4i), 5)
77%!assert (abs ([1.1, 3i; 3+4i, -3-4i]), [1.1, 3; 5, 5])
78
79%!assert (abs (single (1)), single (1))
80%!assert (abs (single (-3.5)), single (3.5))
81%!assert (abs (single (3+4i)), single (5))
82%!assert (abs (single (3-4i)), single (5))
83%!assert (abs (single ([1.1, 3i; 3+4i, -3-4i])), single ([1.1, 3; 5, 5]))
84
85%!error abs ()
86%!error abs (1, 2)
87*/
88
89DEFUN (acos, args, ,
90 doc: /* -*- texinfo -*-
91@deftypefn {} {@var{y} =} acos (@var{x})
92Compute the inverse cosine in radians for each element of @var{x}.
93@seealso{cos, acosd}
94@end deftypefn */)
95{
96 if (args.length () != 1)
97 print_usage ();
98
99 return ovl (args(0).acos ());
100}
101
102/*
103%!shared rt2, rt3
104%! rt2 = sqrt (2);
105%! rt3 = sqrt (3);
106
107%!test
108%! x = [1, rt3/2, rt2/2, 1/2, 0, -1/2, -rt2/2, -rt3/2, -1];
109%! v = [0, pi/6, pi/4, pi/3, pi/2, 2*pi/3, 3*pi/4, 5*pi/6, pi];
110%! assert (acos (x), v, sqrt (eps));
111
112%!test
113%! x = single ([1, rt3/2, rt2/2, 1/2, 0, -1/2, -rt2/2, -rt3/2, -1]);
114%! v = single ([0, pi/6, pi/4, pi/3, pi/2, 2*pi/3, 3*pi/4, 5*pi/6, pi]);
115%! assert (acos (x), v, sqrt (eps ("single")));
116
117## Test values on either side of branch cut
118%!test
119%! rval = 0;
120%! ival = 1.31695789692481671;
121%! obs = acos ([2, 2-i*eps, 2+i*eps]);
122%! exp = [rval + ival*i, rval + ival*i, rval - ival*i];
123%! assert (obs, exp, 3*eps);
124%! rval = pi;
125%! obs = acos ([-2, -2-i*eps, -2+i*eps]);
126%! exp = [rval - ival*i, rval + ival*i, rval - ival*i];
127%! assert (obs, exp, 5*eps);
128%! assert (acos ([2 0]), [ival*i, pi/2], 3*eps);
129%! assert (acos ([2 0i]), [ival*i, pi/2], 3*eps);
130
131## Test large magnitude arguments (bug #45507)
132## Test fails with older versions of libm, solution is to upgrade.
133%!testif ; ! __have_feature__ ("LLVM_LIBCXX") <*45507>
134%! x = [1, -1, i, -i] .* 1e150;
135%! v = [0, pi, pi/2, pi/2];
136%! assert (real (acos (x)), v);
137
138%!testif ; __have_feature__ ("LLVM_LIBCXX") <52627>
139%! ## Same test code as above, but intended for test statistics with libc++.
140%! ## Their trig/hyperbolic functions have huge tolerances.
141%! x = [1, -1, i, -i] .* 1e150;
142%! v = [0, pi, pi/2, pi/2];
143%! assert (real (acos (x)), v);
144
145%!error acos ()
146%!error acos (1, 2)
147*/
148
149DEFUN (acosh, args, ,
150 doc: /* -*- texinfo -*-
151@deftypefn {} {@var{y} =} acosh (@var{x})
152Compute the inverse hyperbolic cosine for each element of @var{x}.
153@seealso{cosh}
154@end deftypefn */)
155{
156 if (args.length () != 1)
157 print_usage ();
158
159 return ovl (args(0).acosh ());
160}
161
162/*
163%!testif ; ! ismac ()
164%! x = [1, 0, -1, 0];
165%! v = [0, pi/2*i, pi*i, pi/2*i];
166%! assert (acosh (x), v, sqrt (eps));
167
168%!testif ; ismac () <52627>
169%! ## Same test code as above, but intended only for test statistics on Mac.
170%! ## Mac trig/hyperbolic functions have huge tolerances.
171%! x = [1, 0, -1, 0];
172%! v = [0, pi/2*i, pi*i, pi/2*i];
173%! assert (acosh (x), v, sqrt (eps));
174
175## FIXME: std::acosh on Windows platforms, returns a result that differs
176## by 1 in the last significant digit. This is ~30*eps which is quite large.
177## The decision now (9/15/2016) is to mark the test with a bug number so
178## it is understood why it is failing, and wait for MinGw to improve their
179## std library.
180%!test <49091>
181%! re = 2.99822295029797;
182%! im = pi/2;
183%! assert (acosh (-10i), re - i*im);
184
185%!testif ; ! ismac ()
186%! x = single ([1, 0, -1, 0]);
187%! v = single ([0, pi/2*i, pi*i, pi/2*i]);
188%! assert (acosh (x), v, sqrt (eps ("single")));
189
190%!testif ; ismac () <52627>
191%! ## Same test code as above, but intended only for test statistics on Mac.
192%! ## Mac trig/hyperbolic functions have huge tolerances.
193%! x = single ([1, 0, -1, 0]);
194%! v = single ([0, pi/2*i, pi*i, pi/2*i]);
195%! assert (acosh (x), v, sqrt (eps ("single")));
196
197%!test <49091>
198%! re = single (2.99822295029797);
199%! im = single (pi/2);
200%! assert (acosh (single (10i)), re + i*im, 5* eps ("single"));
201%! assert (acosh (single (-10i)), re - i*im, 5* eps ("single"));
202
203## Test large magnitude arguments (bug #45507)
204## Test fails with older versions of libm, solution is to upgrade.
205%!testif ; ! __have_feature__ ("LLVM_LIBCXX") <*45507>
206%! x = [1, -1, i, -i] .* 1e150;
207%! v = [0, pi, pi/2, -pi/2];
208%! assert (imag (acosh (x)), v);
209
210%!testif ; __have_feature__ ("LLVM_LIBCXX") <52627>
211%! ## Same test code as above, but intended for test statistics with libc++.
212%! ## Their trig/hyperbolic functions have huge tolerances.
213%! x = [1, -1, i, -i] .* 1e150;
214%! v = [0, pi, pi/2, -pi/2];
215%! assert (imag (acosh (x)), v);
216
217%!error acosh ()
218%!error acosh (1, 2)
219*/
220
221DEFUN (angle, args, ,
222 doc: /* -*- texinfo -*-
223@deftypefn {} {@var{theta} =} angle (@var{z})
224@xref{XREFarg,,@code{arg}}.
225@seealso{arg}
226@end deftypefn */)
227{
228 if (args.length () != 1)
229 print_usage ();
230
231 return ovl (args(0).arg ());
232}
233
234DEFUN (arg, args, ,
235 doc: /* -*- texinfo -*-
236@deftypefn {} {@var{theta} =} arg (@var{z})
237@deftypefnx {} {@var{theta} =} angle (@var{z})
238Compute the argument, i.e., angle of @var{z}.
239
240This is defined as,
241@tex
242$\theta = atan2 (y, x),$
243@end tex
244@ifnottex
245@var{theta} = @code{atan2 (@var{y}, @var{x})},
246@end ifnottex
247in radians.
248
249For example:
250
251@example
252@group
253arg (3 + 4i)
254 @result{} 0.92730
255@end group
256@end example
257@seealso{abs}
258@end deftypefn */)
259{
260 if (args.length () != 1)
261 print_usage ();
262
263 return ovl (args(0).arg ());
264}
265
266/*
267%!assert (arg (1), 0)
268%!assert (arg (i), pi/2)
269%!assert (arg (-1), pi)
270%!assert (arg (-i), -pi/2)
271%!assert (arg ([1, i; -1, -i]), [0, pi/2; pi, -pi/2])
272
273%!assert (arg (single (1)), single (0))
274%!assert (arg (single (i)), single (pi/2))
275%!test
276%! if (ismac ())
277%! ## Avoid failing for a MacOS feature
278%! assert (arg (single (-1)), single (pi), 2* eps (single (1)));
279%! else
280%! assert (arg (single (-1)), single (pi));
281%! endif
282%!assert (arg (single (-i)), single (-pi/2))
283%!assert (arg (single ([1, i; -1, -i])),
284%! single ([0, pi/2; pi, -pi/2]), 2e1* eps ("single"))
285
286%!error arg ()
287%!error arg (1, 2)
288*/
289
290DEFUN (asin, args, ,
291 doc: /* -*- texinfo -*-
292@deftypefn {} {@var{y} =} asin (@var{x})
293Compute the inverse sine in radians for each element of @var{x}.
294@seealso{sin, asind}
295@end deftypefn */)
296{
297 if (args.length () != 1)
298 print_usage ();
299
300 return ovl (args(0).asin ());
301}
302
303/*
304%!shared rt2, rt3
305%! rt2 = sqrt (2);
306%! rt3 = sqrt (3);
307
308%!test
309%! x = [0, 1/2, rt2/2, rt3/2, 1, rt3/2, rt2/2, 1/2, 0];
310%! v = [0, pi/6, pi/4, pi/3, pi/2, pi/3, pi/4, pi/6, 0];
311%! assert (asin (x), v, sqrt (eps));
312
313%!test
314%! x = single ([0, 1/2, rt2/2, rt3/2, 1, rt3/2, rt2/2, 1/2, 0]);
315%! v = single ([0, pi/6, pi/4, pi/3, pi/2, pi/3, pi/4, pi/6, 0]);
316%! assert (asin (x), v, sqrt (eps ("single")));
317
318## Test values on either side of branch cut
319%!test
320%! rval = pi/2;
321%! ival = 1.31695789692481635;
322%! obs = asin ([2, 2-i*eps, 2+i*eps]);
323%! exp = [rval - ival*i, rval - ival*i, rval + ival*i];
324%! if (ismac ())
325%! ## Math libraries on macOS seem to implement asin with less accuracy.
326%! tol = 6*eps;
327%! else
328%! tol = 2*eps;
329%! endif
330%! assert (obs, exp, tol);
331%! obs = asin ([-2, -2-i*eps, -2+i*eps]);
332%! exp = [-rval + ival*i, -rval - ival*i, -rval + ival*i];
333%! assert (obs, exp, tol);
334%! assert (asin ([2 0]), [rval - ival*i, 0], tol);
335%! assert (asin ([2 0i]), [rval - ival*i, 0], tol);
336
337## Test large magnitude arguments (bug #45507)
338## Test fails with older versions of libm, solution is to upgrade.
339%!testif ; ! __have_feature__ ("LLVM_LIBCXX") <*45507>
340%! x = [1, -1, i, -i] .* 1e150;
341%! v = [pi/2, -pi/2, 0, -0];
342%! assert (real (asin (x)), v);
343
344%!testif ; __have_feature__ ("LLVM_LIBCXX") <52627>
345%! ## Same test code as above, but intended for test statistics with libc++.
346%! ## Their trig/hyperbolic functions have huge tolerances.
347%! x = [1, -1, i, -i] .* 1e150;
348%! v = [pi/2, -pi/2, 0, -0];
349%! assert (real (asin (x)), v);
350
351%!error asin ()
352%!error asin (1, 2)
353*/
354
355DEFUN (asinh, args, ,
356 doc: /* -*- texinfo -*-
357@deftypefn {} {@var{y} =} asinh (@var{x})
358Compute the inverse hyperbolic sine for each element of @var{x}.
359@seealso{sinh}
360@end deftypefn */)
361{
362 if (args.length () != 1)
363 print_usage ();
364
365 return ovl (args(0).asinh ());
366}
367
368/*
369%!test
370%! v = [0, pi/2*i, 0, -pi/2*i];
371%! x = [0, i, 0, -i];
372%! assert (asinh (x), v, sqrt (eps));
373
374%!test
375%! v = single ([0, pi/2*i, 0, -pi/2*i]);
376%! x = single ([0, i, 0, -i]);
377%! assert (asinh (x), v, sqrt (eps ("single")));
378
379## Test large magnitude arguments (bug #45507)
380## Test fails with older versions of libm, solution is to upgrade.
381%!testif ; ! __have_feature__ ("LLVM_LIBCXX") <*45507>
382%! x = [1, -1, i, -i] .* 1e150;
383%! v = [0, 0, pi/2, -pi/2];
384%! assert (imag (asinh (x)), v);
385
386%!testif ; __have_feature__ ("LLVM_LIBCXX") <52627>
387%! ## Same test code as above, but intended for test statistics with libc++.
388%! ## Their trig/hyperbolic functions have huge tolerances.
389%! x = [1, -1, i, -i] .* 1e150;
390%! v = [0, 0, pi/2, -pi/2];
391%! assert (imag (asinh (x)), v);
392
393%!error asinh ()
394%!error asinh (1, 2)
395*/
396
397DEFUN (atan, args, ,
398 doc: /* -*- texinfo -*-
399@deftypefn {} {@var{y} =} atan (@var{x})
400Compute the inverse tangent in radians for each element of @var{x}.
401@seealso{tan, atand}
402@end deftypefn */)
403{
404 if (args.length () != 1)
405 print_usage ();
406
407 return ovl (args(0).atan ());
408}
409
410/*
411%!shared rt2, rt3
412%! rt2 = sqrt (2);
413%! rt3 = sqrt (3);
414
415%!test
416%! v = [0, pi/6, pi/4, pi/3, -pi/3, -pi/4, -pi/6, 0];
417%! x = [0, rt3/3, 1, rt3, -rt3, -1, -rt3/3, 0];
418%! assert (atan (x), v, sqrt (eps));
419
420%!test
421%! v = single ([0, pi/6, pi/4, pi/3, -pi/3, -pi/4, -pi/6, 0]);
422%! x = single ([0, rt3/3, 1, rt3, -rt3, -1, -rt3/3, 0]);
423%! assert (atan (x), v, sqrt (eps ("single")));
424
425## Test large magnitude arguments (bug #44310, bug #45507)
426%!test <*44310>
427%! x = [1, -1, i, -i] .* 1e150;
428%! v = [pi/2, -pi/2, pi/2, -pi/2];
429%! assert (real (atan (x)), v);
430%! assert (imag (atan (x)), [0, 0, 0, 0], eps);
431
432%!error atan ()
433%!error atan (1, 2)
434*/
435
436DEFUN (atanh, args, ,
437 doc: /* -*- texinfo -*-
438@deftypefn {} {@var{y} =} atanh (@var{x})
439Compute the inverse hyperbolic tangent for each element of @var{x}.
440@seealso{tanh}
441@end deftypefn */)
442{
443 if (args.length () != 1)
444 print_usage ();
445
446 return ovl (args(0).atanh ());
447}
448
449/*
450%!test
451%! v = [0, 0];
452%! x = [0, 0];
453%! assert (atanh (x), v, sqrt (eps));
454
455%!test
456%! v = single ([0, 0]);
457%! x = single ([0, 0]);
458%! assert (atanh (x), v, sqrt (eps ("single")));
459
460## Test large magnitude arguments (bug #44310, bug #45507)
461%!test <*44310>
462%! x = [1, -1, i, -i] .* 1e150;
463%! v = [pi/2, pi/2, pi/2, -pi/2];
464%! assert (imag (atanh (x)), v);
465%! assert (real (atanh (x)), [0, 0, 0, 0], eps);
466
467%!error atanh ()
468%!error atanh (1, 2)
469*/
470
471DEFUN (cbrt, args, ,
472 doc: /* -*- texinfo -*-
473@deftypefn {} {@var{y} =} cbrt (@var{x})
474Compute the real-valued cube root of each element of @var{x}.
475
476Unlike @code{@var{x}^(1/3)}, the result will be negative if @var{x} is
477negative.
478
479If any element of @var{x} is complex, @code{cbrt} aborts with an error.
480@seealso{nthroot}
481@end deftypefn */)
482{
483 if (args.length () != 1)
484 print_usage ();
485
486 return ovl (args(0).cbrt ());
487}
488
489/*
490%!assert (cbrt (64), 4)
491%!assert (cbrt (-125), -5)
492%!assert (cbrt (0), 0)
493%!assert (cbrt (Inf), Inf)
494%!assert (cbrt (-Inf), -Inf)
495%!assert (cbrt (NaN), NaN)
496%!assert (cbrt (2^300), 2^100)
497%!assert (cbrt (125*2^300), 5*2^100)
498
499%!error cbrt ()
500%!error cbrt (1, 2)
501*/
502
503DEFUN (ceil, args, ,
504 doc: /* -*- texinfo -*-
505@deftypefn {} {@var{y} =} ceil (@var{x})
506Return the smallest integer not less than @var{x}.
507
508This is equivalent to rounding towards positive infinity.
509
510If @var{x} is complex, return
511@code{ceil (real (@var{x})) + ceil (imag (@var{x})) * I}.
512
513@example
514@group
515ceil ([-2.7, 2.7])
516 @result{} -2 3
517@end group
518@end example
519@seealso{floor, round, fix}
520@end deftypefn */)
521{
522 if (args.length () != 1)
523 print_usage ();
524
525 return ovl (args(0).ceil ());
526}
527
528/*
529## double precision
530%!assert (ceil ([2, 1.1, -1.1, -1]), [2, 2, -1, -1])
531
532## complex double precision
533%!assert (ceil ([2+2i, 1.1+1.1i, -1.1-1.1i, -1-i]), [2+2i, 2+2i, -1-i, -1-i])
534
535## single precision
536%!assert (ceil (single ([2, 1.1, -1.1, -1])), single ([2, 2, -1, -1]))
537
538## complex single precision
539%!assert (ceil (single ([2+2i, 1.1+1.1i, -1.1-1.1i, -1-i])),
540%! single ([2+2i, 2+2i, -1-i, -1-i]))
541
542%!error ceil ()
543%!error ceil (1, 2)
544*/
545
546DEFUN (conj, args, ,
547 doc: /* -*- texinfo -*-
548@deftypefn {} {@var{zc} =} conj (@var{z})
549Return the complex conjugate of @var{z}.
550
551The complex conjugate is defined as
552@tex
553$\bar{z} = x - iy$.
554@end tex
555@ifnottex
556@code{conj (@var{z})} = @var{x} - @var{i}@var{y}.
557@end ifnottex
558@seealso{real, imag}
559@end deftypefn */)
560{
561 if (args.length () != 1)
562 print_usage ();
563
564 return ovl (args(0).conj ());
565}
566
567/*
568%!assert (conj (1), 1)
569%!assert (conj (i), -i)
570%!assert (conj (1+i), 1-i)
571%!assert (conj (1-i), 1+i)
572%!assert (conj ([-1, -i; -1+i, -1-i]), [-1, i; -1-i, -1+i])
573
574%!assert (conj (single (1)), single (1))
575%!assert (conj (single (i)), single (-i))
576%!assert (conj (single (1+i)), single (1-i))
577%!assert (conj (single (1-i)), single (1+i))
578%!assert (conj (single ([-1, -i; -1+i, -1-i])), single ([-1, i; -1-i, -1+i]))
579
580%!error conj ()
581%!error conj (1, 2)
582*/
583
584DEFUN (cos, args, ,
585 doc: /* -*- texinfo -*-
586@deftypefn {} {@var{y} =} cos (@var{x})
587Compute the cosine for each element of @var{x} in radians.
588@seealso{acos, cosd, cosh}
589@end deftypefn */)
590{
591 if (args.length () != 1)
592 print_usage ();
593
594 return ovl (args(0).cos ());
595}
596
597/*
598%!shared rt2, rt3
599%! rt2 = sqrt (2);
600%! rt3 = sqrt (3);
601
602%!test
603%! x = [0, pi/6, pi/4, pi/3, pi/2, 2*pi/3, 3*pi/4, 5*pi/6, pi];
604%! v = [1, rt3/2, rt2/2, 1/2, 0, -1/2, -rt2/2, -rt3/2, -1];
605%! assert (cos (x), v, sqrt (eps));
606
607%!test
608%! rt2 = sqrt (2);
609%! rt3 = sqrt (3);
610%! x = single ([0, pi/6, pi/4, pi/3, pi/2, 2*pi/3, 3*pi/4, 5*pi/6, pi]);
611%! v = single ([1, rt3/2, rt2/2, 1/2, 0, -1/2, -rt2/2, -rt3/2, -1]);
612%! assert (cos (x), v, sqrt (eps ("single")));
613
614%!error cos ()
615%!error cos (1, 2)
616*/
617
618DEFUN (cosh, args, ,
619 doc: /* -*- texinfo -*-
620@deftypefn {} {@var{y} =} cosh (@var{x})
621Compute the hyperbolic cosine for each element of @var{x}.
622@seealso{acosh, sinh, tanh}
623@end deftypefn */)
624{
625 if (args.length () != 1)
626 print_usage ();
627
628 return ovl (args(0).cosh ());
629}
630
631/*
632%!test
633%! x = [0, pi/2*i, pi*i, 3*pi/2*i];
634%! v = [1, 0, -1, 0];
635%! assert (cosh (x), v, sqrt (eps));
636
637%!test
638%! x = single ([0, pi/2*i, pi*i, 3*pi/2*i]);
639%! v = single ([1, 0, -1, 0]);
640%! assert (cosh (x), v, sqrt (eps ("single")));
641
642%!error cosh ()
643%!error cosh (1, 2)
644*/
645
646DEFUN (erf, args, ,
647 doc: /* -*- texinfo -*-
648@deftypefn {} {@var{v} =} erf (@var{z})
649Compute the error function.
650
651The error function is defined as
652@tex
653$$
654 {\rm erf} (z) = {2 \over \sqrt{\pi}}\int_0^z e^{-t^2} dt
655$$
656@end tex
657@ifnottex
658
659@example
660@group
661 z
662 2 /
663erf (z) = --------- * | e^(-t^2) dt
664 sqrt (pi) /
665 t=0
666@end group
667@end example
668
669@end ifnottex
670@seealso{erfc, erfcx, erfi, dawson, erfinv, erfcinv}
671@end deftypefn */)
672{
673 if (args.length () != 1)
674 print_usage ();
675
676 return ovl (args(0).erf ());
677}
678
679/*
680%!test
681%! a = -1i* sqrt (-1/(6.4187*6.4187));
682%! assert (erf (a), erf (real (a)));
683
684%!test
685%! x = [0,.5,1];
686%! v = [0, .520499877813047, .842700792949715];
687%! assert (erf (x), v, 1.e-10);
688%! assert (erf (-x), -v, 1.e-10);
689%! assert (erfc (x), 1-v, 1.e-10);
690%! assert (erfinv (v), x, 1.e-10);
691
692%!test
693%! a = -1i* sqrt (single (-1/(6.4187*6.4187)));
694%! assert (erf (a), erf (real (a)));
695
696%!test
697%! x = single ([0,.5,1]);
698%! v = single ([0, .520499877813047, .842700792949715]);
699%! assert (erf (x), v, 1.e-6);
700%! assert (erf (-x), -v, 1.e-6);
701%! assert (erfc (x), 1-v, 1.e-6);
702%! assert (erfinv (v), x, 1.e-6);
703
704%!test
705%! x = [1+2i,-1+2i,1e-6+2e-6i,0+2i];
706%! v = [-0.53664356577857-5.04914370344703i, 0.536643565778565-5.04914370344703i, 0.112837916709965e-5+0.225675833419178e-5i, 18.5648024145755526i];
707%! assert (erf (x), v, -1.e-10);
708%! assert (erf (-x), -v, -1.e-10);
709%! assert (erfc (x), 1-v, -1.e-10);
710
711%!error erf ()
712%!error erf (1, 2)
713*/
714
715DEFUN (erfinv, args, ,
716 doc: /* -*- texinfo -*-
717@deftypefn {} {@var{y} =} erfinv (@var{x})
718Compute the inverse error function.
719
720The inverse error function is defined such that
721
722@example
723erf (@var{y}) == @var{x}
724@end example
725@seealso{erf, erfc, erfcx, erfi, dawson, erfcinv}
726@end deftypefn */)
727{
728 if (args.length () != 1)
729 print_usage ();
730
731 return ovl (args(0).erfinv ());
732}
733
734/*
735## middle region
736%!assert (erf (erfinv ([-0.9 -0.3 0 0.4 0.8])), [-0.9 -0.3 0 0.4 0.8], eps)
737%!assert (erf (erfinv (single ([-0.9 -0.3 0 0.4 0.8]))),
738%! single ([-0.9 -0.3 0 0.4 0.8]), eps ("single"))
739## tail region
740%!assert (erf (erfinv ([-0.999 -0.99 0.9999 0.99999])),
741%! [-0.999 -0.99 0.9999 0.99999], eps)
742%!assert (erf (erfinv (single ([-0.999 -0.99 0.9999 0.99999]))),
743%! single ([-0.999 -0.99 0.9999 0.99999]), eps ("single"))
744## backward - loss of accuracy
745%!assert (erfinv (erf ([-3 -1 -0.4 0.7 1.3 2.8])),
746%! [-3 -1 -0.4 0.7 1.3 2.8], -1e-12)
747%!assert (erfinv (erf (single ([-3 -1 -0.4 0.7 1.3 2.8]))),
748%! single ([-3 -1 -0.4 0.7 1.3 2.8]), -1e-4)
749## exceptional
750%!assert (erfinv ([-1, 1, 1.1, -2.1]), [-Inf, Inf, NaN, NaN])
751%!error erfinv (1+2i)
752
753%!error erfinv ()
754%!error erfinv (1, 2)
755*/
756
757DEFUN (erfcinv, args, ,
758 doc: /* -*- texinfo -*-
759@deftypefn {} {@var{y} =} erfcinv (@var{x})
760Compute the inverse complementary error function.
761
762The inverse complementary error function is defined such that
763
764@example
765erfc (@var{y}) == @var{x}
766@end example
767@seealso{erfc, erf, erfcx, erfi, dawson, erfinv}
768@end deftypefn */)
769{
770 if (args.length () != 1)
771 print_usage ();
772
773 return ovl (args(0).erfcinv ());
774}
775
776/*
777## middle region
778%!assert (erfc (erfcinv ([1.9 1.3 1 0.6 0.2])), [1.9 1.3 1 0.6 0.2], eps)
779%!assert (erfc (erfcinv (single ([1.9 1.3 1 0.6 0.2]))),
780%! single ([1.9 1.3 1 0.6 0.2]), eps ("single"))
781## tail region
782%!assert (erfc (erfcinv ([0.001 0.01 1.9999 1.99999])),
783%! [0.001 0.01 1.9999 1.99999], eps)
784%!assert (erfc (erfcinv (single ([0.001 0.01 1.9999 1.99999]))),
785%! single ([0.001 0.01 1.9999 1.99999]), eps ("single"))
786## backward - loss of accuracy
787%!assert (erfcinv (erfc ([-3 -1 -0.4 0.7 1.3 2.8])),
788%! [-3 -1 -0.4 0.7 1.3 2.8], -1e-12)
789%!testif ; ! ispc ()
790%! assert (erfcinv (erfc (single ([-3 -1 -0.4 0.7 1.3 2.8]))),
791%! single ([-3 -1 -0.4 0.7 1.3 2.8]), -1e-4)
792%!testif ; ispc () <65075>
793%! ## Same test code as above, but intended for test statistics with the UCRT.
794%! ## The deviations are twice as high with it.
795%! assert (erfcinv (erfc (single ([-3 -1 -0.4 0.7 1.3 2.8]))),
796%! single ([-3 -1 -0.4 0.7 1.3 2.8]), -1e-4)
797## exceptional
798%!assert (erfcinv ([2, 0, -0.1, 2.1]), [-Inf, Inf, NaN, NaN])
799%!error erfcinv (1+2i)
800
801%!error erfcinv ()
802%!error erfcinv (1, 2)
803*/
804
805DEFUN (erfc, args, ,
806 doc: /* -*- texinfo -*-
807@deftypefn {} {@var{v} =} erfc (@var{z})
808Compute the complementary error function.
809
810The complementary error function is defined as
811@tex
812$1 - {\rm erf} (z)$.
813@end tex
814@ifnottex
815@w{@code{1 - erf (@var{z})}}.
816@end ifnottex
817@seealso{erfcinv, erfcx, erfi, dawson, erf, erfinv}
818@end deftypefn */)
819{
820 if (args.length () != 1)
821 print_usage ();
822
823 return ovl (args(0).erfc ());
824}
825
826/*
827%!test
828%! a = -1i* sqrt (-1/(6.4187*6.4187));
829%! assert (erfc (a), erfc (real (a)));
830
831%!error erfc ()
832%!error erfc (1, 2)
833*/
834
835DEFUN (erfcx, args, ,
836 doc: /* -*- texinfo -*-
837@deftypefn {} {@var{v} =} erfcx (@var{z})
838Compute the scaled complementary error function.
839
840The scaled complementary error function is defined as
841@tex
842$$
843 e^{z^2} {\rm erfc} (z) \equiv e^{z^2} (1 - {\rm erf} (z))
844$$
845@end tex
846@ifnottex
847
848@example
849exp (z^2) * erfc (z)
850@end example
851
852@end ifnottex
853@seealso{erfc, erf, erfi, dawson, erfinv, erfcinv}
854@end deftypefn */)
855{
856 if (args.length () != 1)
857 print_usage ();
858
859 return ovl (args(0).erfcx ());
860}
861
862/*
863
864%!test
865%! x = [1+2i,-1+2i,1e-6+2e-6i,0+2i];
866%! assert (erfcx (x), exp (x.^2) .* erfc (x), -1.e-10);
867
868%!test
869%! x = [100, 100+20i];
870%! v = [0.0056416137829894329, 0.0054246791754558-0.00108483153786434i];
871%! assert (erfcx (x), v, -1.e-10);
872
873%!error erfcx ()
874%!error erfcx (1, 2)
875*/
876
877DEFUN (erfi, args, ,
878 doc: /* -*- texinfo -*-
879@deftypefn {} {@var{v} =} erfi (@var{z})
880Compute the imaginary error function.
881
882The imaginary error function is defined as
883@tex
884$$
885 -i {\rm erf} (iz)
886$$
887@end tex
888@ifnottex
889
890@example
891-i * erf (i*z)
892@end example
893
894@end ifnottex
895@seealso{erfc, erf, erfcx, dawson, erfinv, erfcinv}
896@end deftypefn */)
897{
898 if (args.length () != 1)
899 print_usage ();
900
901 return ovl (args(0).erfi ());
902}
903
904/*
905
906%!test
907%! x = [-0.1, 0.1, 1, 1+2i,-1+2i,1e-6+2e-6i,0+2i];
908%! assert (erfi (x), -i * erf (i*x), -1.e-10);
909
910%!error erfi ()
911%!error erfi (1, 2)
912*/
913
914DEFUN (dawson, args, ,
915 doc: /* -*- texinfo -*-
916@deftypefn {} {@var{v} =} dawson (@var{z})
917Compute the Dawson (scaled imaginary error) function.
918
919The Dawson function is defined as
920@tex
921$$
922 {\sqrt{\pi} \over 2} e^{-z^2} {\rm erfi} (z) \equiv -i {\sqrt{\pi} \over 2} e^{-z^2} {\rm erf} (iz)
923$$
924@end tex
925@ifnottex
926
927@example
928(sqrt (pi) / 2) * exp (-z^2) * erfi (z)
929@end example
930
931@end ifnottex
932@seealso{erfc, erf, erfcx, erfi, erfinv, erfcinv}
933@end deftypefn */)
934{
935 if (args.length () != 1)
936 print_usage ();
937
938 return ovl (args(0).dawson ());
939}
940
941/*
942
943%!test
944%! x = [0.1, 1, 1+2i,-1+2i,1e-4+2e-4i,0+2i];
945%! v = [0.099335992397852861, 0.53807950691, -13.38892731648-11.828715104i, 13.38892731648-11.828715104i, 0.0001000000073333+0.000200000001333i, 48.160012114291i];
946%! assert (dawson (x), v, -1.e-10);
947%! assert (dawson (-x), -v, -1.e-10);
948
949%!error dawson ()
950%!error dawson (1, 2)
951*/
952
953DEFUN (exp, args, ,
954 doc: /* -*- texinfo -*-
955@deftypefn {} {@var{y} =} exp (@var{x})
956Compute
957@tex
958$e^{x}$
959@end tex
960@ifnottex
961@code{e^x}
962@end ifnottex
963for each element of @var{x}.
964
965To compute the matrix exponential, @pxref{Linear Algebra}.
966@seealso{log}
967@end deftypefn */)
968{
969 if (args.length () != 1)
970 print_usage ();
971
972 return ovl (args(0).exp ());
973}
974
975/*
976%!assert (exp ([0, 1, -1, -1000]), [1, e, 1/e, 0], sqrt (eps))
977%!assert (exp (1+i), e * (cos (1) + sin (1) * i), sqrt (eps))
978%!assert (exp (single ([0, 1, -1, -1000])),
979%! single ([1, e, 1/e, 0]), sqrt (eps ("single")))
980%!assert (exp (single (1+i)),
981%! single (e * (cos (1) + sin (1) * i)), sqrt (eps ("single")))
982
983%!assert (exp ([Inf, -Inf, NaN]), [Inf 0 NaN])
984%!assert (exp (single ([Inf, -Inf, NaN])), single ([Inf 0 NaN]))
985
986%!error exp ()
987%!error exp (1, 2)
988*/
989
990DEFUN (expm1, args, ,
991 doc: /* -*- texinfo -*-
992@deftypefn {} {@var{y} =} expm1 (@var{x})
993Compute
994@tex
995$ e^{x} - 1 $
996@end tex
997@ifnottex
998@code{exp (@var{x}) - 1}
999@end ifnottex
1000accurately in the neighborhood of zero.
1001@seealso{exp}
1002@end deftypefn */)
1003{
1004 if (args.length () != 1)
1005 print_usage ();
1006
1007 return ovl (args(0).expm1 ());
1008}
1009
1010/*
1011%!assert (expm1 (2*eps), 2*eps, 1e-29)
1012
1013%!assert (expm1 ([Inf, -Inf, NaN]), [Inf -1 NaN])
1014%!assert (expm1 (single ([Inf, -Inf, NaN])), single ([Inf -1 NaN]))
1015
1016%!error expm1 ()
1017%!error expm1 (1, 2)
1018*/
1019
1020DEFUN (isfinite, args, ,
1021 doc: /* -*- texinfo -*-
1022@deftypefn {} {@var{tf} =} isfinite (@var{x})
1023Return a logical array which is true where the elements of @var{x} are
1024finite values and false where they are not.
1025
1026For example:
1027
1028@example
1029@group
1030isfinite ([13, Inf, NA, NaN])
1031 @result{} [ 1, 0, 0, 0 ]
1032@end group
1033@end example
1034@seealso{isinf, isnan, isna}
1035@end deftypefn */)
1036{
1037 if (args.length () != 1)
1038 print_usage ();
1039
1040 return ovl (args(0).isfinite ());
1041}
1042
1043/*
1044%!assert (! isfinite (Inf))
1045%!assert (! isfinite (NaN))
1046%!assert (isfinite (rand (1,10)))
1047
1048%!assert (! isfinite (single (Inf)))
1049%!assert (! isfinite (single (NaN)))
1050%!assert (isfinite (single (rand (1,10))))
1051%!assert (isfinite ('a'))
1052
1053%!error isfinite ()
1054%!error isfinite (1, 2)
1055*/
1056
1057DEFUN (fix, args, ,
1058 doc: /* -*- texinfo -*-
1059@deftypefn {} {@var{y} =} fix (@var{x})
1060Truncate fractional portion of @var{x} and return the integer portion.
1061
1062This is equivalent to rounding towards zero. If @var{x} is complex, return
1063@code{fix (real (@var{x})) + fix (imag (@var{x})) * I}.
1064
1065@example
1066@group
1067fix ([-2.7, 2.7])
1068 @result{} -2 2
1069@end group
1070@end example
1071@seealso{ceil, floor, round}
1072@end deftypefn */)
1073{
1074 if (args.length () != 1)
1075 print_usage ();
1076
1077 return ovl (args(0).fix ());
1078}
1079
1080/*
1081%!assert (fix ([1.1, 1, -1.1, -1]), [1, 1, -1, -1])
1082%!assert (fix ([1.1+1.1i, 1+i, -1.1-1.1i, -1-i]), [1+i, 1+i, -1-i, -1-i])
1083%!assert (fix (single ([1.1, 1, -1.1, -1])), single ([1, 1, -1, -1]))
1084%!assert (fix (single ([1.1+1.1i, 1+i, -1.1-1.1i, -1-i])),
1085%! single ([1+i, 1+i, -1-i, -1-i]))
1086
1087%!error fix ()
1088%!error fix (1, 2)
1089*/
1090
1091DEFUN (floor, args, ,
1092 doc: /* -*- texinfo -*-
1093@deftypefn {} {@var{y} =} floor (@var{x})
1094Return the largest integer not greater than @var{x}.
1095
1096This is equivalent to rounding towards negative infinity. If @var{x} is
1097complex, return @code{floor (real (@var{x})) + floor (imag (@var{x})) * I}.
1098
1099@example
1100@group
1101floor ([-2.7, 2.7])
1102 @result{} -3 2
1103@end group
1104@end example
1105@seealso{ceil, round, fix}
1106@end deftypefn */)
1107{
1108 if (args.length () != 1)
1109 print_usage ();
1110
1111 return ovl (args(0).floor ());
1112}
1113
1114/*
1115%!assert (floor ([2, 1.1, -1.1, -1]), [2, 1, -2, -1])
1116%!assert (floor ([2+2i, 1.1+1.1i, -1.1-1.1i, -1-i]), [2+2i, 1+i, -2-2i, -1-i])
1117%!assert (floor (single ([2, 1.1, -1.1, -1])), single ([2, 1, -2, -1]))
1118%!assert (floor (single ([2+2i, 1.1+1.1i, -1.1-1.1i, -1-i])),
1119%! single ([2+2i, 1+i, -2-2i, -1-i]))
1120
1121%!error floor ()
1122%!error floor (1, 2)
1123*/
1124
1125DEFUN (gamma, args, ,
1126 doc: /* -*- texinfo -*-
1127@deftypefn {} {@var{v} =} gamma (@var{z})
1128Compute the Gamma function.
1129
1130The Gamma function is defined as
1131@tex
1132$$
1133 \Gamma (z) = \int_0^\infty t^{z-1} e^{-t} dt.
1134$$
1135@end tex
1136@ifnottex
1137
1138@example
1139@group
1140 infinity
1141 /
1142gamma (z) = | t^(z-1) exp (-t) dt.
1143 /
1144 t=0
1145@end group
1146@end example
1147
1148@end ifnottex
1149
1150Programming Note: The gamma function can grow quite large even for small
1151input values. In many cases it may be preferable to use the natural
1152logarithm of the gamma function (@code{gammaln}) in calculations to minimize
1153loss of precision. The final result is then
1154@code{exp (@var{result_using_gammaln}).}
1155@seealso{gammainc, gammaln, factorial}
1156@end deftypefn */)
1157{
1158 if (args.length () != 1)
1159 print_usage ();
1160
1161 return ovl (args(0).gamma ());
1162}
1163
1164/*
1165%!test
1166%! a = -1i* sqrt (-1/(6.4187*6.4187));
1167%! assert (gamma (a), gamma (real (a)));
1168
1169%!test
1170%! x = [.5, 1, 1.5, 2, 3, 4, 5];
1171%! v = [sqrt(pi), 1, .5*sqrt(pi), 1, 2, 6, 24];
1172%! assert (gamma (x), v, sqrt (eps));
1173
1174%!test
1175%! a = single (-1i* sqrt (-1/(6.4187*6.4187)));
1176%! assert (gamma (a), gamma (real (a)));
1177
1178%!test
1179%! x = single ([.5, 1, 1.5, 2, 3, 4, 5]);
1180%! v = single ([sqrt(pi), 1, .5*sqrt(pi), 1, 2, 6, 24]);
1181%! assert (gamma (x), v, sqrt (eps ("single")));
1182
1183%!test
1184%! ## Test exceptional values
1185%! x = [-Inf, -1, -0, 0, 1, Inf, NaN];
1186%! v = [Inf, Inf, -Inf, Inf, 1, Inf, NaN];
1187%! assert (gamma (x), v);
1188%! assert (gamma (single (x)), single (v));
1189
1190%!error gamma ()
1191%!error gamma (1, 2)
1192*/
1193
1194DEFUN (imag, args, ,
1195 doc: /* -*- texinfo -*-
1196@deftypefn {} {@var{y} =} imag (@var{z})
1197Return the imaginary part of @var{z} as a real number.
1198@seealso{real, conj}
1199@end deftypefn */)
1200{
1201 if (args.length () != 1)
1202 print_usage ();
1203
1204 return ovl (args(0).imag ());
1205}
1206
1207/*
1208%!assert (imag (1), 0)
1209%!assert (imag (i), 1)
1210%!assert (imag (1+i), 1)
1211%!assert (imag ([i, 1; 1, i]), full (eye (2)))
1212
1213%!assert (imag (single (1)), single (0))
1214%!assert (imag (single (i)), single (1))
1215%!assert (imag (single (1+i)), single (1))
1216%!assert (imag (single ([i, 1; 1, i])), full (eye (2,"single")))
1217
1218%!error imag ()
1219%!error imag (1, 2)
1220*/
1221
1222DEFUNX ("isalnum", Fisalnum, args, ,
1223 doc: /* -*- texinfo -*-
1224@deftypefn {} {@var{tf} =} isalnum (@var{s})
1225Return a logical array which is true where the elements of @var{s} are
1226letters or digits and false where they are not.
1227
1228This is equivalent to (@code{isalpha (@var{s}) | isdigit (@var{s})}).
1229@seealso{isalpha, isdigit, ispunct, isspace, iscntrl}
1230@end deftypefn */)
1231{
1232 if (args.length () != 1)
1233 print_usage ();
1234
1235 return ovl (args(0).xisalnum ());
1236}
1237
1238/*
1239%!test
1240%! charset = char (0:127);
1241%! result = false (1, 128);
1242%! result(double ("A":"Z") + 1) = true;
1243%! result(double ("0":"9") + 1) = true;
1244%! result(double ("a":"z") + 1) = true;
1245%! assert (isalnum (charset), result);
1246%!assert (isalnum(["Ä8Aa?"; "(Uß ;"]), logical ([1 1 1 1 1 0; 0 1 1 1 0 0]))
1247
1248%!error isalnum ()
1249%!error isalnum (1, 2)
1250*/
1251
1252DEFUNX ("isalpha", Fisalpha, args, ,
1253 doc: /* -*- texinfo -*-
1254@deftypefn {} {@var{tf} =} isalpha (@var{s})
1255Return a logical array which is true where the elements of @var{s} are
1256letters and false where they are not.
1257
1258This is equivalent to (@code{islower (@var{s}) | isupper (@var{s})}).
1259@seealso{isdigit, ispunct, isspace, iscntrl, isalnum, islower, isupper}
1260@end deftypefn */)
1261{
1262 if (args.length () != 1)
1263 print_usage ();
1264
1265 return ovl (args(0).xisalpha ());
1266}
1267
1268/*
1269%!test
1270%! charset = char (0:127);
1271%! result = false (1, 128);
1272%! result(double ("A":"Z") + 1) = true;
1273%! result(double ("a":"z") + 1) = true;
1274%! assert (isalpha (charset), result);
1275%!assert (isalpha("Ä8Aa(Uß ;"), logical ([1 1 0 1 1 0 1 1 1 0 0]))
1276
1277%!error isalpha ()
1278%!error isalpha (1, 2)
1279*/
1280
1281DEFUNX ("isascii", Fisascii, args, ,
1282 doc: /* -*- texinfo -*-
1283@deftypefn {} {@var{tf} =} isascii (@var{s})
1284Return a logical array which is true where the elements of @var{s} are
1285ASCII characters (in the range 0 to 127 decimal) and false where they are
1286not.
1287@end deftypefn */)
1288{
1289 if (args.length () != 1)
1290 print_usage ();
1291
1292 return ovl (args(0).xisascii ());
1293}
1294
1295/*
1296%!test
1297%! charset = char (0:127);
1298%! result = true (1, 128);
1299%! assert (isascii (charset), result);
1300
1301%!error isascii ()
1302%!error isascii (1, 2)
1303*/
1304
1305DEFUNX ("iscntrl", Fiscntrl, args, ,
1306 doc: /* -*- texinfo -*-
1307@deftypefn {} {@var{tf} =} iscntrl (@var{s})
1308Return a logical array which is true where the elements of @var{s} are
1309control characters and false where they are not.
1310@seealso{ispunct, isspace, isalpha, isdigit}
1311@end deftypefn */)
1312{
1313 if (args.length () != 1)
1314 print_usage ();
1315
1316 return ovl (args(0).xiscntrl ());
1317}
1318
1319/*
1320%!test
1321%! charset = char (0:127);
1322%! result = false (1, 128);
1323%! result(1:32) = true;
1324%! result(128) = true;
1325%! assert (iscntrl (charset), result);
1326
1327%!error iscntrl ()
1328%!error iscntrl (1, 2)
1329*/
1330
1331DEFUNX ("isdigit", Fisdigit, args, ,
1332 doc: /* -*- texinfo -*-
1333@deftypefn {} {@var{tf} =} isdigit (@var{s})
1334Return a logical array which is true where the elements of @var{s} are
1335decimal digits (0-9) and false where they are not.
1336@seealso{isxdigit, isalpha, isletter, ispunct, isspace, iscntrl}
1337@end deftypefn */)
1338{
1339 if (args.length () != 1)
1340 print_usage ();
1341
1342 return ovl (args(0).xisdigit ());
1343}
1344
1345/*
1346%!test
1347%! charset = char (0:127);
1348%! result = false (1, 128);
1349%! result(double ("0":"9") + 1) = true;
1350%! assert (isdigit (charset), result);
1351%!assert (isdigit("Ä8Aa(Uß ;"), logical ([0 0 1 0 0 0 0 0 0 0 0]))
1352
1353%!error isdigit ()
1354%!error isdigit (1, 2)
1355*/
1356
1357DEFUN (isinf, args, ,
1358 doc: /* -*- texinfo -*-
1359@deftypefn {} {@var{tf} =} isinf (@var{x})
1360Return a logical array which is true where the elements of @var{x} are
1361infinite and false where they are not.
1362
1363For example:
1364
1365@example
1366@group
1367isinf ([13, Inf, NA, NaN])
1368 @result{} [ 0, 1, 0, 0 ]
1369@end group
1370@end example
1371@seealso{isfinite, isnan, isna}
1372@end deftypefn */)
1373{
1374 if (args.length () != 1)
1375 print_usage ();
1376
1377 return ovl (args(0).isinf ());
1378}
1379
1380/*
1381%!assert (isinf (Inf))
1382%!assert (! isinf (NaN))
1383%!assert (! isinf (NA))
1384%!assert (isinf (rand (1,10)), false (1,10))
1385%!assert (isinf ([NaN -Inf -1 0 1 Inf NA]),
1386%! [false, true, false, false, false, true, false])
1387
1388%!assert (isinf (single (Inf)))
1389%!assert (! isinf (single (NaN)))
1390%!assert (! isinf (single (NA)))
1391%!assert (isinf (single (rand (1,10))), false (1,10))
1392%!assert (isinf (single ([NaN -Inf -1 0 1 Inf NA])),
1393%! [false, true, false, false, false, true, false])
1394%!assert (! isinf ('a'))
1395
1396%!error isinf ()
1397%!error isinf (1, 2)
1398*/
1399
1400DEFUNX ("isgraph", Fisgraph, args, ,
1401 doc: /* -*- texinfo -*-
1402@deftypefn {} {@var{tf} =} isgraph (@var{s})
1403Return a logical array which is true where the elements of @var{s} are
1404printable characters (but not the space character) and false where they are
1405not.
1406@seealso{isprint}
1407@end deftypefn */)
1408{
1409 if (args.length () != 1)
1410 print_usage ();
1411
1412 return ovl (args(0).xisgraph ());
1413}
1414
1415/*
1416%!test
1417%! charset = char (0:127);
1418%! result = false (1, 128);
1419%! result(34:127) = true;
1420%! assert (isgraph (charset), result);
1421%!assert (isgraph("Ä8Aa(Uß ;"), logical ([1 1 1 1 1 1 1 1 1 0 1]))
1422
1423%!error isgraph ()
1424%!error isgraph (1, 2)
1425*/
1426
1427DEFUNX ("islower", Fislower, args, ,
1428 doc: /* -*- texinfo -*-
1429@deftypefn {} {@var{tf} =} islower (@var{s})
1430Return a logical array which is true where the elements of @var{s} are
1431lowercase letters and false where they are not.
1432@seealso{isupper, isalpha, isletter, isalnum}
1433@end deftypefn */)
1434{
1435 if (args.length () != 1)
1436 print_usage ();
1437
1438 return ovl (args(0).xislower ());
1439}
1440
1441/*
1442%!test
1443%! charset = char (0:127);
1444%! result = false (1, 128);
1445%! result(double ("a":"z") + 1) = true;
1446%! assert (islower (charset), result);
1447%!assert (islower("Ä8Aa(Uß ;"), logical ([0 0 0 0 1 0 0 1 1 0 0]))
1448
1449%!error islower ()
1450%!error islower (1, 2)
1451*/
1452
1453DEFUN (isna, args, ,
1454 doc: /* -*- texinfo -*-
1455@deftypefn {} {@var{tf} =} isna (@var{x})
1456Return a logical array which is true where the elements of @var{x} are
1457NA (missing) values and false where they are not.
1458
1459For example:
1460
1461@example
1462@group
1463isna ([13, Inf, NA, NaN])
1464 @result{} [ 0, 0, 1, 0 ]
1465@end group
1466@end example
1467@seealso{isnan, isinf, isfinite}
1468@end deftypefn */)
1469{
1470 if (args.length () != 1)
1471 print_usage ();
1472
1473 return ovl (args(0).isna ());
1474}
1475
1476/*
1477%!assert (! isna (Inf))
1478%!assert (! isna (NaN))
1479%!assert (isna (NA))
1480%!assert (isna (rand (1,10)), false (1,10))
1481%!assert (isna ([NaN -Inf -1 0 1 Inf NA]),
1482%! [false, false, false, false, false, false, true])
1483
1484%!assert (! isna (single (Inf)))
1485%!assert (! isna (single (NaN)))
1486%!assert (isna (single (NA)))
1487%!assert (isna (single (rand (1,10))), false (1,10))
1488%!assert (isna (single ([NaN -Inf -1 0 1 Inf NA])),
1489%! [false, false, false, false, false, false, true])
1490
1491%!error isna ()
1492%!error isna (1, 2)
1493*/
1494
1495DEFUN (isnan, args, ,
1496 doc: /* -*- texinfo -*-
1497@deftypefn {} {@var{tf} =} isnan (@var{x})
1498Return a logical array which is true where the elements of @var{x} are
1499NaN values and false where they are not.
1500
1501NA values are also considered NaN values. For example:
1502
1503@example
1504@group
1505isnan ([13, Inf, NA, NaN])
1506 @result{} [ 0, 0, 1, 1 ]
1507@end group
1508@end example
1509@seealso{isna, isinf, isfinite}
1510@end deftypefn */)
1511{
1512 if (args.length () != 1)
1513 print_usage ();
1514
1515 return ovl (args(0).isnan ());
1516}
1517
1518/*
1519%!assert (! isnan (Inf))
1520%!assert (isnan (NaN))
1521%!assert (isnan (NA))
1522%!assert (isnan (rand (1,10)), false (1,10))
1523%!assert (isnan ([NaN -Inf -1 0 1 Inf NA]),
1524%! [true, false, false, false, false, false, true])
1525
1526%!assert (! isnan (single (Inf)))
1527%!assert (isnan (single (NaN)))
1528%!assert (isnan (single (NA)))
1529%!assert (isnan (single (rand (1,10))), false (1,10))
1530%!assert (isnan (single ([NaN -Inf -1 0 1 Inf NA])),
1531%! [true, false, false, false, false, false, true])
1532%!assert (! isnan ('a'))
1533
1534%!error isnan ()
1535%!error isnan (1, 2)
1536*/
1537
1538DEFUNX ("isprint", Fisprint, args, ,
1539 doc: /* -*- texinfo -*-
1540@deftypefn {} {@var{tf} =} isprint (@var{s})
1541Return a logical array which is true where the elements of @var{s} are
1542printable characters (including the space character) and false where they
1543are not.
1544@seealso{isgraph}
1545@end deftypefn */)
1546{
1547 if (args.length () != 1)
1548 print_usage ();
1549
1550 return ovl (args(0).xisprint ());
1551}
1552
1553/*
1554%!test
1555%! charset = char (0:127);
1556%! result = false (1, 128);
1557%! result(33:127) = true;
1558%! assert (isprint (charset), result);
1559%!assert (isprint("Ä8Aa(Uß ;"), logical ([1 1 1 1 1 1 1 1 1 1 1]))
1560
1561%!error isprint ()
1562%!error isprint (1, 2)
1563*/
1564
1565DEFUNX ("ispunct", Fispunct, args, ,
1566 doc: /* -*- texinfo -*-
1567@deftypefn {} {@var{tf} =} ispunct (@var{s})
1568Return a logical array which is true where the elements of @var{s} are
1569punctuation characters and false where they are not.
1570@seealso{isalpha, isdigit, isspace, iscntrl}
1571@end deftypefn */)
1572{
1573 if (args.length () != 1)
1574 print_usage ();
1575
1576 return ovl (args(0).xispunct ());
1577}
1578
1579/*
1580%!test
1581%! charset = char (0:127);
1582%! result = false (1, 128);
1583%! result(34:48) = true;
1584%! result(59:65) = true;
1585%! result(92:97) = true;
1586%! result(124:127) = true;
1587%! assert (ispunct (charset), result);
1588%!assert (ispunct("Ä8Aa(Uß ;"), logical ([0 0 0 0 0 1 0 0 0 0 1]))
1589
1590%!error ispunct ()
1591%!error ispunct (1, 2)
1592*/
1593
1594DEFUNX ("isspace", Fisspace, args, ,
1595 doc: /* -*- texinfo -*-
1596@deftypefn {} {@var{tf} =} isspace (@var{s})
1597Return a logical array which is true where the elements of @var{s} are
1598whitespace characters (space, formfeed, newline, carriage return, tab, and
1599vertical tab) and false where they are not.
1600@seealso{iscntrl, ispunct, isalpha, isdigit}
1601@end deftypefn */)
1602{
1603 if (args.length () != 1)
1604 print_usage ();
1605
1606 return ovl (args(0).xisspace ());
1607}
1608
1609/*
1610%!test
1611%! charset = char (0:127);
1612%! result = false (1, 128);
1613%! result(double (" \f\n\r\t\v") + 1) = true;
1614%! assert (isspace (charset), result);
1615%!assert (isspace("Ä8Aa(Uß ;"), logical ([0 0 0 0 0 0 0 0 0 1 0]))
1616
1617%!error isspace ()
1618%!error isspace (1, 2)
1619*/
1620
1621DEFUNX ("isupper", Fisupper, args, ,
1622 doc: /* -*- texinfo -*-
1623@deftypefn {} {@var{tf} =} isupper (@var{s})
1624Return a logical array which is true where the elements of @var{s} are
1625uppercase letters and false where they are not.
1626@seealso{islower, isalpha, isletter, isalnum}
1627@end deftypefn */)
1628{
1629 if (args.length () != 1)
1630 print_usage ();
1631
1632 return ovl (args(0).xisupper ());
1633}
1634
1635/*
1636%!test
1637%! charset = char (0:127);
1638%! result = false (1, 128);
1639%! result(double ("A":"Z") + 1) = true;
1640%! assert (isupper (charset), result);
1641%!assert (isupper("Ä8Aa(Uß ;"), logical ([1 1 0 1 0 0 1 0 0 0 0]))
1642
1643%!error isupper ()
1644%!error isupper (1, 2)
1645*/
1646
1647DEFUNX ("isxdigit", Fisxdigit, args, ,
1648 doc: /* -*- texinfo -*-
1649@deftypefn {} {@var{tf} =} isxdigit (@var{s})
1650Return a logical array which is true where the elements of @var{s} are
1651hexadecimal digits (0-9 and @nospell{a-fA-F}).
1652@seealso{isdigit}
1653@end deftypefn */)
1654{
1655 if (args.length () != 1)
1656 print_usage ();
1657
1658 return ovl (args(0).xisxdigit ());
1659}
1660
1661/*
1662%!test
1663%! charset = char (0:127);
1664%! result = false (1, 128);
1665%! result(double ("A":"F") + 1) = true;
1666%! result(double ("0":"9") + 1) = true;
1667%! result(double ("a":"f") + 1) = true;
1668%! assert (isxdigit (charset), result);
1669%!assert (isxdigit("Ä8Aa(Uß ;"), logical ([0 0 1 1 1 0 0 0 0 0 0]))
1670
1671%!error isxdigit ()
1672%!error isxdigit (1, 2)
1673*/
1674
1675DEFUN (lgamma, args, ,
1676 doc: /* -*- texinfo -*-
1677@deftypefn {} {@var{y} =} gammaln (@var{x})
1678@deftypefnx {} {@var{y} =} lgamma (@var{x})
1679Return the natural logarithm of the gamma function of @var{x}.
1680
1681Programming Note: @code{lgamma} is an alias for @code{gammaln} and either name
1682can be used in Octave.
1683@seealso{gamma, gammainc}
1684@end deftypefn */)
1685{
1686 if (args.length () != 1)
1687 print_usage ();
1688
1689 return ovl (args(0).lgamma ());
1690}
1691
1692/*
1693%!test
1694%! a = -1i* sqrt (-1/(6.4187*6.4187));
1695%! assert (gammaln (a), gammaln (real (a)));
1696
1697%!test
1698%! x = [.5, 1, 1.5, 2, 3, 4, 5];
1699%! v = [sqrt(pi), 1, .5*sqrt(pi), 1, 2, 6, 24];
1700%! assert (gammaln (x), log (v), sqrt (eps));
1701
1702%!test
1703%! a = single (-1i* sqrt (-1/(6.4187*6.4187)));
1704%! assert (gammaln (a), gammaln (real (a)));
1705
1706%!test
1707%! x = single ([.5, 1, 1.5, 2, 3, 4, 5]);
1708%! v = single ([sqrt(pi), 1, .5*sqrt(pi), 1, 2, 6, 24]);
1709%! assert (gammaln (x), log (v), sqrt (eps ("single")));
1710
1711%!test
1712%! x = [-1, 0, 1, Inf];
1713%! v = [Inf, Inf, 0, Inf];
1714%! assert (gammaln (x), v);
1715%! assert (gammaln (single (x)), single (v));
1716
1717%!error gammaln ()
1718%!error gammaln (1,2)
1719*/
1720
1721DEFUN (log, args, ,
1722 doc: /* -*- texinfo -*-
1723@deftypefn {} {@var{y} =} log (@var{x})
1724Compute the natural logarithm,
1725@tex
1726$\ln{(x)},$
1727@end tex
1728@ifnottex
1729@code{ln (@var{x})},
1730@end ifnottex
1731for each element of @var{x}.
1732
1733To compute the matrix logarithm, @pxref{Linear Algebra}.
1734@seealso{exp, log1p, log2, log10, logspace}
1735@end deftypefn */)
1736{
1737 if (args.length () != 1)
1738 print_usage ();
1739
1740 return ovl (args(0).log ());
1741}
1742
1743/*
1744%!assert (log ([1, e, e^2]), [0, 1, 2], sqrt (eps))
1745%!assert (log ([-0.5, -1.5, -2.5]), log ([0.5, 1.5, 2.5]) + pi*1i, sqrt (eps))
1746
1747%!assert (log (single ([1, e, e^2])), single ([0, 1, 2]), sqrt (eps ("single")))
1748%!assert (log (single ([-0.5, -1.5, -2.5])),
1749%! single (log ([0.5, 1.5, 2.5]) + pi*1i), 4* eps ("single"))
1750
1751%!error log ()
1752%!error log (1, 2)
1753*/
1754
1755DEFUN (log10, args, ,
1756 doc: /* -*- texinfo -*-
1757@deftypefn {} {@var{y} =} log10 (@var{x})
1758Compute the base-10 logarithm of each element of @var{x}.
1759@seealso{log, log2, logspace, exp}
1760@end deftypefn */)
1761{
1762 if (args.length () != 1)
1763 print_usage ();
1764
1765 return ovl (args(0).log10 ());
1766}
1767
1768/*
1769%!assert (log10 ([0.01, 0.1, 1, 10, 100]), [-2, -1, 0, 1, 2], sqrt (eps))
1770%!assert (log10 (single ([0.01, 0.1, 1, 10, 100])),
1771%! single ([-2, -1, 0, 1, 2]), sqrt (eps ("single")))
1772
1773%!error log10 ()
1774%!error log10 (1, 2)
1775*/
1776
1777DEFUN (log1p, args, ,
1778 doc: /* -*- texinfo -*-
1779@deftypefn {} {@var{y} =} log1p (@var{x})
1780Compute
1781@tex
1782$\ln{(1 + x)}$
1783@end tex
1784@ifnottex
1785@code{log (1 + @var{x})}
1786@end ifnottex
1787accurately in the neighborhood of zero.
1788@seealso{log, exp, expm1}
1789@end deftypefn */)
1790{
1791 if (args.length () != 1)
1792 print_usage ();
1793
1794 return ovl (args(0).log1p ());
1795}
1796
1797/*
1798%!assert (log1p ([0, 2*eps, -2*eps]), [0, 2*eps, -2*eps], 1e-29)
1799%!assert (log1p (single ([0, 2*eps, -2*eps])), ...
1800%! single ([0, 2*eps, -2*eps]), 1e-29)
1801## Compare to result from Wolfram Alpha rounded to 16 significant digits
1802%!assert <*62094> (log1p (0.1i), ...
1803%! 0.004975165426584041 + 0.09966865249116203i, eps (0.2))
1804%!assert <*62094> (log1p (single (0.1i)), ...
1805%! single (0.004975165426584041 + 0.09966865249116203i), ...
1806%! eps (single (0.2)))
1807
1808%!error log1p ()
1809%!error log1p (1, 2)
1810*/
1811
1812DEFUN (real, args, ,
1813 doc: /* -*- texinfo -*-
1814@deftypefn {} {@var{x} =} real (@var{z})
1815Return the real part of @var{z}.
1816@seealso{imag, conj}
1817@end deftypefn */)
1818{
1819 if (args.length () != 1)
1820 print_usage ();
1821
1822 return ovl (args(0).real ());
1823}
1824
1825/*
1826%!assert (real (1), 1)
1827%!assert (real (i), 0)
1828%!assert (real (1+i), 1)
1829%!assert (real ([1, i; i, 1]), full (eye (2)))
1830
1831%!assert (real (single (1)), single (1))
1832%!assert (real (single (i)), single (0))
1833%!assert (real (single (1+i)), single (1))
1834%!assert (real (single ([1, i; i, 1])), full (eye (2, "single")))
1835
1836%!error real ()
1837%!error real (1, 2)
1838*/
1839
1840DEFUN (round, args, ,
1841 doc: /* -*- texinfo -*-
1842@deftypefn {} {@var{y} =} round (@var{x})
1843Return the integer nearest to @var{x}.
1844
1845If @var{x} is complex, return
1846@code{round (real (@var{x})) + round (imag (@var{x})) * I}. If there
1847are two nearest integers, return the one further away from zero.
1848
1849@example
1850@group
1851round ([-2.7, 2.7])
1852 @result{} -3 3
1853@end group
1854@end example
1855@seealso{ceil, floor, fix, roundb}
1856@end deftypefn */)
1857{
1858 if (args.length () != 1)
1859 print_usage ();
1860
1861 return ovl (args(0).round ());
1862}
1863
1864/*
1865%!assert (round (1), 1)
1866%!assert (round (1.1), 1)
1867%!assert (round (5.5), 6)
1868%!assert (round (i), i)
1869%!assert (round (2.5+3.5i), 3+4i)
1870%!assert (round (-2.6), -3)
1871%!assert (round ([1.1, -2.4; -3.7, 7.1]), [1, -2; -4, 7])
1872
1873%!assert (round (single (1)), single (1))
1874%!assert (round (single (1.1)), single (1))
1875%!assert (round (single (5.5)), single (6))
1876%!assert (round (single (i)), single (i))
1877%!assert (round (single (2.5+3.5i)), single (3+4i))
1878%!assert (round (single (-2.6)), single (-3))
1879%!assert (round (single ([1.1, -2.4; -3.7, 7.1])), single ([1, -2; -4, 7]))
1880
1881%!error round ()
1882%!error round (1, 2)
1883*/
1884
1885DEFUN (roundb, args, ,
1886 doc: /* -*- texinfo -*-
1887@deftypefn {} {@var{y} =} roundb (@var{x})
1888Return the integer nearest to @var{x}. If there are two nearest
1889integers, return the even one (banker's rounding).
1890
1891If @var{x} is complex,
1892return @code{roundb (real (@var{x})) + roundb (imag (@var{x})) * I}.
1893@seealso{round}
1894@end deftypefn */)
1895{
1896 if (args.length () != 1)
1897 print_usage ();
1898
1899 return ovl (args(0).roundb ());
1900}
1901
1902/*
1903%!assert (roundb (1), 1)
1904%!assert (roundb (1.1), 1)
1905%!assert (roundb (1.5), 2)
1906%!assert (roundb (4.5), 4)
1907%!assert (roundb (i), i)
1908%!assert (roundb (2.5+3.5i), 2+4i)
1909%!assert (roundb (-2.6), -3)
1910%!assert (roundb ([1.1, -2.4; -3.7, 7.1]), [1, -2; -4, 7])
1911
1912%!assert (roundb (single (1)), single (1))
1913%!assert (roundb (single (1.1)), single (1))
1914%!assert (roundb (single (1.5)), single (2))
1915%!assert (roundb (single (4.5)), single (4))
1916%!assert (roundb (single (i)), single (i))
1917%!assert (roundb (single (2.5+3.5i)), single (2+4i))
1918%!assert (roundb (single (-2.6)), single (-3))
1919%!assert (roundb (single ([1.1, -2.4; -3.7, 7.1])), single ([1, -2; -4, 7]))
1920
1921%!error roundb ()
1922%!error roundb (1, 2)
1923*/
1924
1925DEFUN (sign, args, ,
1926 doc: /* -*- texinfo -*-
1927@deftypefn {} {@var{y} =} sign (@var{x})
1928Compute the @dfn{signum} function.
1929
1930This is defined as
1931@tex
1932$$
1933{\rm sign} (@var{x}) = \cases{1,&$x>0$;\cr 0,&$x=0$;\cr -1,&$x<0$.\cr}
1934$$
1935@end tex
1936@ifnottex
1937
1938@example
1939@group
1940 -1, x < 0;
1941sign (x) = 0, x = 0;
1942 1, x > 0.
1943@end group
1944@end example
1945
1946@end ifnottex
1947
1948For complex arguments, @code{sign} returns @code{x ./ abs (@var{x})}.
1949
1950Note that @code{sign (-0.0)} is 0. Although IEEE 754 floating point
1951allows zero to be signed, 0.0 and -0.0 compare equal. If you must test
1952whether zero is signed, use the @code{signbit} function.
1953@seealso{signbit}
1954@end deftypefn */)
1955{
1956 if (args.length () != 1)
1957 print_usage ();
1958
1959 return ovl (args(0).signum ());
1960}
1961
1962/*
1963%!assert (sign (-2) , -1)
1964%!assert (sign (0), 0)
1965%!assert (sign (3), 1)
1966%!assert (sign ([1, -pi; e, 0]), [1, -1; 1, 0])
1967
1968%!assert (sign (single (-2)) , single (-1))
1969%!assert (sign (single (0)), single (0))
1970%!assert (sign (single (3)), single (1))
1971%!assert (sign (single ([1, -pi; e, 0])), single ([1, -1; 1, 0]))
1972
1973%!error sign ()
1974%!error sign (1, 2)
1975*/
1976
1977DEFUNX ("signbit", Fsignbit, args, ,
1978 doc: /* -*- texinfo -*-
1979@deftypefn {} {@var{y} =} signbit (@var{x})
1980Return logical true if the value of @var{x} has its sign bit set and false
1981otherwise.
1982
1983This behavior is consistent with the other logical functions.
1984@xref{Logical Values}. The behavior differs from the C language function
1985which returns nonzero if the sign bit is set.
1986
1987This is not the same as @code{x < 0.0}, because IEEE 754 floating point
1988allows zero to be signed. The comparison @code{-0.0 < 0.0} is false,
1989but @code{signbit (-0.0)} will return a nonzero value.
1990@seealso{sign}
1991@end deftypefn */)
1992{
1993 if (args.length () != 1)
1994 print_usage ();
1995
1996 octave_value tmp = args(0).xsignbit ();
1997
1998 return ovl (tmp != 0);
1999}
2000
2001/*
2002%!assert (signbit (1) == 0)
2003%!assert (signbit (-2) != 0)
2004%!assert (signbit (0) == 0)
2005%!assert (signbit (-0) != 0)
2006
2007%!assert (signbit (single (1)) == 0)
2008%!assert (signbit (single (-2)) != 0)
2009%!assert (signbit (single (0)) == 0)
2010%!assert (signbit (single (-0)) != 0)
2011
2012%!error sign ()
2013%!error sign (1, 2)
2014*/
2015
2016DEFUN (sin, args, ,
2017 doc: /* -*- texinfo -*-
2018@deftypefn {} {@var{y} =} sin (@var{x})
2019Compute the sine for each element of @var{x} in radians.
2020@seealso{asin, sind, sinh}
2021@end deftypefn */)
2022{
2023 if (args.length () != 1)
2024 print_usage ();
2025
2026 return ovl (args(0).sin ());
2027}
2028
2029/*
2030%!shared rt2, rt3
2031%! rt2 = sqrt (2);
2032%! rt3 = sqrt (3);
2033
2034%!test
2035%! x = [0, pi/6, pi/4, pi/3, pi/2, 2*pi/3, 3*pi/4, 5*pi/6, pi];
2036%! v = [0, 1/2, rt2/2, rt3/2, 1, rt3/2, rt2/2, 1/2, 0];
2037%! assert (sin (x), v, sqrt (eps));
2038
2039%!test
2040%! x = single ([0, pi/6, pi/4, pi/3, pi/2, 2*pi/3, 3*pi/4, 5*pi/6, pi]);
2041%! v = single ([0, 1/2, rt2/2, rt3/2, 1, rt3/2, rt2/2, 1/2, 0]);
2042%! assert (sin (x), v, sqrt (eps ("single")));
2043
2044%!error sin ()
2045%!error sin (1, 2)
2046*/
2047
2048DEFUN (sinh, args, ,
2049 doc: /* -*- texinfo -*-
2050@deftypefn {} {@var{y} =} sinh (@var{x})
2051Compute the hyperbolic sine for each element of @var{x}.
2052@seealso{asinh, cosh, tanh}
2053@end deftypefn */)
2054{
2055 if (args.length () != 1)
2056 print_usage ();
2057
2058 return ovl (args(0).sinh ());
2059}
2060
2061/*
2062%!test
2063%! x = [0, pi/2*i, pi*i, 3*pi/2*i];
2064%! v = [0, i, 0, -i];
2065%! assert (sinh (x), v, sqrt (eps));
2066
2067%!test
2068%! x = single ([0, pi/2*i, pi*i, 3*pi/2*i]);
2069%! v = single ([0, i, 0, -i]);
2070%! assert (sinh (x), v, sqrt (eps ("single")));
2071
2072%!error sinh ()
2073%!error sinh (1, 2)
2074*/
2075
2076DEFUN (sqrt, args, ,
2077 doc: /* -*- texinfo -*-
2078@deftypefn {} {@var{y} =} sqrt (@var{x})
2079Compute the square root of each element of @var{x}.
2080
2081If @var{x} is negative, a complex result is returned.
2082
2083To compute the matrix square root, @pxref{Linear Algebra}.
2084@seealso{realsqrt, nthroot}
2085@end deftypefn */)
2086{
2087 if (args.length () != 1)
2088 print_usage ();
2089
2090 return ovl (args(0).sqrt ());
2091}
2092
2093/*
2094%!assert (sqrt (4), 2)
2095%!assert (sqrt (-1), i)
2096%!assert (sqrt (1+i), exp (0.5 * log (1+i)), sqrt (eps))
2097%!assert (sqrt ([4, -4; i, 1-i]),
2098%! [2, 2i; exp(0.5 * log (i)), exp(0.5 * log (1-i))], sqrt (eps))
2099
2100%!assert (sqrt (single (4)), single (2))
2101%!assert (sqrt (single (-1)), single (i))
2102%!assert (sqrt (single (1+i)),
2103%! single (exp (0.5 * log (1+i))), sqrt (eps ("single")))
2104%!assert (sqrt (single ([4, -4; i, 1-i])),
2105%! single ([2, 2i; exp(0.5 * log (i)), exp(0.5 * log (1-i))]),
2106%! sqrt (eps ("single")))
2107
2108%!error sqrt ()
2109%!error sqrt (1, 2)
2110*/
2111
2112DEFUN (tan, args, ,
2113 doc: /* -*- texinfo -*-
2114@deftypefn {} {@var{y} =} tan (@var{z})
2115Compute the tangent for each element of @var{x} in radians.
2116@seealso{atan, tand, tanh}
2117@end deftypefn */)
2118{
2119 if (args.length () != 1)
2120 print_usage ();
2121
2122 return ovl (args(0).tan ());
2123}
2124
2125/*
2126%!shared rt2, rt3
2127%! rt2 = sqrt (2);
2128%! rt3 = sqrt (3);
2129
2130%!test
2131%! x = [0, pi/6, pi/4, pi/3, 2*pi/3, 3*pi/4, 5*pi/6, pi];
2132%! v = [0, rt3/3, 1, rt3, -rt3, -1, -rt3/3, 0];
2133%! assert (tan (x), v, sqrt (eps));
2134
2135%!test
2136%! x = single ([0, pi/6, pi/4, pi/3, 2*pi/3, 3*pi/4, 5*pi/6, pi]);
2137%! v = single ([0, rt3/3, 1, rt3, -rt3, -1, -rt3/3, 0]);
2138%! assert (tan (x), v, sqrt (eps ("single")));
2139
2140%!error tan ()
2141%!error tan (1, 2)
2142*/
2143
2144DEFUN (tanh, args, ,
2145 doc: /* -*- texinfo -*-
2146@deftypefn {} {@var{y} =} tanh (@var{x})
2147Compute hyperbolic tangent for each element of @var{x}.
2148@seealso{atanh, sinh, cosh}
2149@end deftypefn */)
2150{
2151 if (args.length () != 1)
2152 print_usage ();
2153
2154 return ovl (args(0).tanh ());
2155}
2156
2157/*
2158%!test
2159%! x = [0, pi*i];
2160%! v = [0, 0];
2161%! assert (tanh (x), v, sqrt (eps));
2162
2163%!test
2164%! x = single ([0, pi*i]);
2165%! v = single ([0, 0]);
2166%! assert (tanh (x), v, sqrt (eps ("single")));
2167
2168%!error tanh ()
2169%!error tanh (1, 2)
2170*/
2171
2172DEFUN (lower, args, ,
2173 doc: /* -*- texinfo -*-
2174@deftypefn {} {@var{y} =} lower (@var{s})
2175@deftypefnx {} {@var{y} =} tolower (@var{s})
2176Return a copy of the string or cell string @var{s}, with each uppercase
2177character replaced by the corresponding lowercase one; non-alphabetic
2178characters are left unchanged.
2179
2180For example:
2181
2182@example
2183@group
2184lower ("MiXeD cAsE 123")
2185 @result{} "mixed case 123"
2186@end group
2187@end example
2188
2189Programming Note: @code{tolower} is an alias for @code{lower} and either name
2190can be used in Octave.
2191
2192@seealso{upper}
2193@end deftypefn */)
2194{
2195 if (args.length () != 1)
2196 print_usage ();
2197
2198 return ovl (args(0).xtolower ());
2199}
2200
2201DEFALIAS (tolower, lower);
2202
2203/*
2204%!assert (lower ("OCTAVE"), "octave")
2205%!assert (lower ("123OCTave! _&"), "123octave! _&")
2206%!assert (lower ({"ABC", "DEF", {"GHI", {"JKL"}}}),
2207%! {"abc", "def", {"ghi", {"jkl"}}})
2208%!assert (lower (["ABC"; "DEF"]), ["abc"; "def"])
2209%!assert (lower ({["ABC"; "DEF"]}), {["abc";"def"]})
2210%!assert (lower (["ABCÄÖÜSS"; "abcäöüß"]),
2211%! ["abcäöüss"; "abcäöüß"])
2212%!assert (lower (repmat ("ÄÖÜ", 2, 1, 3)), repmat ("äöü", 2, 1, 3))
2213%!assert (lower (68), 68)
2214%!assert (lower ({[68, 68; 68, 68]}), {[68, 68; 68, 68]})
2215%!assert (lower (68i), 68i)
2216%!assert (lower ({[68i, 68; 68, 68i]}), {[68i, 68; 68, 68i]})
2217%!assert (lower (single (68i)), single (68i))
2218%!assert (lower ({single([68i, 68; 68, 68i])}), {single([68i, 68; 68, 68i])})
2219
2220%!test
2221%! classes = {@char, @double, @single, ...
2222%! @int8, @int16, @int32, @int64, ...
2223%! @uint8, @uint16, @uint32, @uint64};
2224%! for i = 1:numel (classes)
2225%! cls = classes{i};
2226%! assert (class (lower (cls (97))), class (cls (97)));
2227%! assert (class (lower (cls ([98, 99]))), class (cls ([98, 99])));
2228%! endfor
2229%!test
2230%! a(3,3,3,3) = "D";
2231%! assert (lower (a)(3,3,3,3), "d");
2232
2233%!test
2234%! charset = char (0:127);
2235%! result = charset;
2236%! result (double ("A":"Z") + 1) = result (double ("a":"z") + 1);
2237%! assert (lower (charset), result);
2238
2239%!error <Invalid call to lower> lower ()
2240%!error <Invalid call to lower> tolower ()
2241%!error lower (1, 2)
2242*/
2243
2244DEFUN (upper, args, ,
2245 doc: /* -*- texinfo -*-
2246@deftypefn {} {@var{y} =} upper (@var{s})
2247@deftypefnx {} {@var{y} =} toupper (@var{s})
2248Return a copy of the string or cell string @var{s}, with each lowercase
2249character replaced by the corresponding uppercase one; non-alphabetic
2250characters are left unchanged.
2251
2252For example:
2253
2254@example
2255@group
2256upper ("MiXeD cAsE 123")
2257 @result{} "MIXED CASE 123"
2258@end group
2259@end example
2260
2261Programming Note: @code{toupper} is an alias for @code{upper} and either name
2262can be used in Octave.
2263
2264@seealso{lower}
2265@end deftypefn */)
2266{
2267 if (args.length () != 1)
2268 print_usage ();
2269
2270 return ovl (args(0).xtoupper ());
2271}
2272
2273DEFALIAS (toupper, upper);
2274
2275/*
2276%!assert (upper ("octave"), "OCTAVE")
2277%!assert (upper ("123OCTave! _&"), "123OCTAVE! _&")
2278%!assert (upper ({"abc", "def", {"ghi", {"jkl"}}}),
2279%! {"ABC", "DEF", {"GHI", {"JKL"}}})
2280%!assert (upper (["abc"; "def"]), ["ABC"; "DEF"])
2281%!assert (upper ({["abc"; "def"]}), {["ABC";"DEF"]})
2282%!assert (upper (["ABCÄÖÜSS"; "abcäöüß"]),
2283%! ["ABCÄÖÜSS"; "ABCÄÖÜSS"])
2284%!assert (upper (repmat ("äöü", 2, 1, 3)), repmat ("ÄÖÜ", 2, 1, 3))
2285%!assert (upper (100), 100)
2286%!assert (upper ({[100, 100; 100, 100]}), {[100, 100; 100, 100]})
2287%!assert (upper (100i), 100i)
2288%!assert (upper ({[100i, 100; 100, 100i]}), {[100i, 100; 100, 100i]})
2289%!assert (upper (single (100i)), single (100i))
2290%!assert (upper ({single([100i, 100; 100, 100i])}),
2291%! {single([100i, 100; 100, 100i])})
2292
2293%!test
2294%! classes = {@char, @double, @single, ...
2295%! @int8, @int16, @int32, @int64, ...
2296%! @uint8, @uint16, @uint32, @uint64};
2297%! for i = 1:numel (classes)
2298%! cls = classes{i};
2299%! assert (class (upper (cls (97))), class (cls (97)));
2300%! assert (class (upper (cls ([98, 99]))), class (cls ([98, 99])));
2301%! endfor
2302%!test
2303%! a(3,3,3,3) = "d";
2304%! assert (upper (a)(3,3,3,3), "D");
2305%!test
2306%! charset = char (0:127);
2307%! result = charset;
2308%! result (double ("a":"z") + 1) = result (double ("A":"Z") + 1);
2309%! assert (upper (charset), result);
2310
2311%!error <Invalid call to upper> upper ()
2312%!error <Invalid call to upper> toupper ()
2313%!error upper (1, 2)
2314*/
2315
2316DEFALIAS (gammaln, lgamma);
2317
2318OCTAVE_END_NAMESPACE(octave)
ComplexColumnVector conj(const ComplexColumnVector &a)
octave_value xsignbit() const
Definition ov.h:1522
ColumnVector real(const ComplexColumnVector &a)
ColumnVector imag(const ComplexColumnVector &a)
OCTAVE_BEGIN_NAMESPACE(octave) static octave_value daspk_fcn
void print_usage()
Definition defun-int.h:72
#define DEFUN(name, args_name, nargout_name, doc)
Macro to define a builtin function.
Definition defun.h:56
#define DEFUNX(name, fname, args_name, nargout_name, doc)
Macro to define a builtin function with certain internal name.
Definition defun.h:85
#define DEFALIAS(alias, name)
Macro to define an alias for another existing function name.
Definition defun.h:160
function gamma(x)
Definition gamma.f:3
Complex asin(const Complex &x)
bool isna(double x)
Definition lo-mappers.cc:47
Complex acos(const Complex &x)
Definition lo-mappers.cc:85
std::complex< T > ceil(const std::complex< T > &x)
Definition lo-mappers.h:103
Complex atan(const Complex &x)
Definition lo-mappers.h:71
double roundb(double x)
Definition lo-mappers.h:147
std::complex< T > floor(const std::complex< T > &x)
Definition lo-mappers.h:130
bool isfinite(double x)
Definition lo-mappers.h:192
bool isinf(double x)
Definition lo-mappers.h:203
double signum(double x)
Definition lo-mappers.h:229
double round(double x)
Definition lo-mappers.h:136
bool isnan(bool)
Definition lo-mappers.h:178
double fix(double x)
Definition lo-mappers.h:118
double erfinv(double x)
double erfi(double x)
double dawson(double x)
Complex erf(const Complex &x)
double erfcinv(double x)
double erfcx(double x)
Complex expm1(const Complex &x)
Complex log1p(const Complex &x)
Complex erfc(const Complex &x)
double cbrt(double x)
Definition lo-specfun.h:289
double asinh(double x)
Definition lo-specfun.h:58
double atanh(double x)
Definition lo-specfun.h:63
double acosh(double x)
Definition lo-specfun.h:40
double lgamma(double x)
Definition lo-specfun.h:336
octave_value_list Fisascii(const octave_value_list &args, int)
Definition mappers.cc:1287
octave_value_list Fispunct(const octave_value_list &args, int)
Definition mappers.cc:1571
octave_value_list Fisgraph(const octave_value_list &args, int)
Definition mappers.cc:1407
octave_value_list Fisupper(const octave_value_list &args, int)
Definition mappers.cc:1627
octave_value_list Fisspace(const octave_value_list &args, int)
Definition mappers.cc:1601
octave_value_list Fislower(const octave_value_list &args, int)
Definition mappers.cc:1433
octave_value_list Fisdigit(const octave_value_list &args, int)
Definition mappers.cc:1337
octave_value_list Fiscntrl(const octave_value_list &args, int)
Definition mappers.cc:1311
octave_value_list Fisalnum(const octave_value_list &args, int)
Definition mappers.cc:1230
octave_value_list Fisalpha(const octave_value_list &args, int)
Definition mappers.cc:1260
octave_value_list Fisxdigit(const octave_value_list &args, int)
Definition mappers.cc:1653
octave_value_list Fsignbit(const octave_value_list &args, int)
Definition mappers.cc:1991
octave_value_list Fisprint(const octave_value_list &args, int)
Definition mappers.cc:1545
octave_value_list ovl(const OV_Args &... args)
Construct an octave_value_list with less typing.
Definition ovl.h:217
template int8_t abs(int8_t)