Update tests of nthroot function.
[scilab.git] / scilab / modules / elementary_functions / macros / nthroot.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) Scilab Enterprises - 2012 - Adeline CARNIS
3 //
4 // This file must be used under the terms of the CeCILL.
5 // This source file is licensed as described in the file COPYING, which
6 // you should have received as part of this distribution.  The terms
7 // are also available at
8 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
9
10 function y = nthroot(x,n)
11
12     rhs = argn(2);
13
14     // If the number of input arguments is wrong
15     if rhs <> 2 then
16         error(msprintf(gettext("%s: Wrong number of input argument(s): %d expected.\n"), "nthroot", 2));
17     end
18
19     // If x or n are not real
20     if typeof(x) <> "constant" | ~isreal(x)  then
21         error(msprintf(gettext("%s: Wrong type for input argument #%d: Real scalar or matrix expected.\n"),"nthroot", 1));
22     end
23     
24     if typeof(n) <> "constant" | ~isreal(n) then
25         error(msprintf(gettext("%s: Wrong type for input argument #%d: Real scalar or matrix expected.\n"),"nthroot", 2));
26     end
27
28     // If n is a vector which size is different from x's
29     if (size(n,"*")>1 & size(n,"*")<>size(x,"*")) then
30         error(msprintf(gettext("%s: Wrong size for input argument #%d and #%d: Same sizes expected.\n"),"nthroot", 1, 2));
31     end
32
33     reste = modulo(n,2);
34     // Making 'reste' one element
35     if (size(n,"*")>1) then
36         reste = or(reste(find(x<0))<>0);
37     end
38     y = x;
39
40     if (or(n==0) & (x>=0 | isnan(x))) then
41         // If n = 0 and x = 1 or x = %nan then y = %nan
42         y(find((x==1 | isnan(x)) & n==0)) = %nan;
43         // If n = 0 and x>1 then y = %inf
44         y(find(x>1 & n==0)) = %inf;
45         // If n = 0 and x = %eps then y = 0
46         y(find(x==%eps & n==0)) = 0;
47     end
48
49     if (x==[]) then
50         y = [];
51     elseif (n==[]) then
52         y = x;
53         // If n = %nan and x is positive then y = %nan
54     elseif (isnan(n) & or(x >= 0)) then
55         y(find(x>=0)) = %nan;
56     elseif (or (or(x(:)<0) & (or(n~=fix(n)) | reste==0 | reste==%f))) then
57         error(msprintf(gettext("%s: If x is negative, then n must contain odd integers only.\n"),"nthroot"));
58         // If n ~=0 and n ~= %nan
59     elseif (or(n~=0) & ~isnan(n)) then
60         // If x = 0 and n is negative and n i~= %nan
61         [m1,m2] = size(x(find(x==0 & n<0 & ~isinf(n))));
62         y(find(x==0 & n<0 & ~isinf(n))) = (x(find(x==0 & n<0 & ~isinf(n)))+ones(m1,m2)) .*%inf;
63         if (size(n,"*") == 1) then
64             // If x = 0 and n is positive and n ~= %nan
65             y(find(x==0 & (n>0 |isinf(n)))) = x(find(x==0 & (n>0 |isinf(n)))).^(1 ./n(find(n<>0)));
66             // If x is positive
67             y(find(x>0)) = x(find(x>0)).^(1 ./n(find(n<>0)));
68             // If x is negative
69             y(find(x<0)) = sign(x(find(x<0))).*(abs(x(find(x<0)))).^(1 ./n(find(n<>0)));
70         else
71             // If x = 0 and n is positive and n ~= %nan
72             y(find(x==0 & (n>0 |isinf(n)))) = x(find(x==0 & (n>0 |isinf(n)))).^(1 ./n(find(x==0 & n<>0)));
73             // If x is positive
74             y(find(x>0 & n<>0)) = x(find(x>0 & n<>0)).^(1 ./n(find(x>0 & n<>0)));
75             // If x is negative
76             y(find(x<0 & n<>0)) = sign(x(find(x<0 & n<>0))).*(abs(x(find(x<0)))).^(1 ./n(find(x<0 & n<>0)));
77         end
78     end
79
80 endfunction