Mercurial > octave
view scripts/elfun/cosd.m @ 29168:8a2449d40f3c
cosd.m, sind.m: Extend input to complex inputs.
* sind.m: Reword documentation to be clearer. Add input validation
to ensure X is numeric. Determine whether X is complex and use
different algorithm for real versus complex. Add BIST tests
for special values (Inf, NaN). Add BIST tests to verify parity
of function. Add BIST test for large value input. Add BIST tests
for complex inputs. Add BIST test for input validation.
* cosd.m: Reword documentation to be clearer. Add input validation
to ensure X is numeric. Add BIST tests for same cases as in sind().
author | Rik <rik@octave.org> |
---|---|
date | Wed, 09 Dec 2020 19:17:10 -0800 |
parents | b7a4460333c9 |
children | 576d0bf372a4 |
line wrap: on
line source
######################################################################## ## ## Copyright (C) 2006-2020 The Octave Project Developers ## ## See the file COPYRIGHT.md in the top-level directory of this ## distribution or <https://octave.org/copyright/>. ## ## This file is part of Octave. ## ## Octave is free software: you can redistribute it and/or modify it ## under the terms of the GNU General Public License as published by ## the Free Software Foundation, either version 3 of the License, or ## (at your option) any later version. ## ## Octave is distributed in the hope that it will be useful, but ## WITHOUT ANY WARRANTY; without even the implied warranty of ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License ## along with Octave; see the file COPYING. If not, see ## <https://www.gnu.org/licenses/>. ## ######################################################################## ## -*- texinfo -*- ## @deftypefn {} {} cosd (@var{x}) ## Compute the cosine for each element of @var{x} in degrees. ## ## The function is more accurate than @code{cos} for large values of @var{x} ## and for multiples of 90 degrees (@code{@var{x} = 90 + 180*n} with n an ## integer) where @code{cosd} returns 0 rather than a small value on the order ## of eps. ## @seealso{acosd, cos} ## @end deftypefn function y = cosd (x) if (nargin < 1) print_usage (); endif if (! isnumeric (x)) error ("cosd: X must be numeric"); endif ## Advance phase by 90 degrees to transform sin to cos and use sind(). y = sind (x + 90); endfunction %!assert (cosd (10:20:360), cos ([10:20:360] * pi/180), 5*eps) %!assert (cosd ([-270, -90, 90, 270]) == 0) %!assert (cosd ([-360, -180, 0, 180, 360]), [1, -1, 1, -1, 1]) %!assert (cosd ([-Inf, NaN, +Inf, 0]), [NaN, NaN, NaN, 1]) %!assert (cosd (+23) == cosd (-23)) %!assert (cosd (1e6), 0.17364817766693033, 5*eps) %!assert (cosd (90 + 180i), -i*sinh (pi)) %!assert (cosd (1e6 + 180i), 2.01292156189451577 + 11.3732880565446539i, 5*eps) %!error <Invalid call> cosd () %!error <X must be numeric> cosd ("abc")