Add 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)) | (typeof(n) <> "constant" | ~isreal(n))) then
21         error(msprintf(gettext("%s: Wrong type for input argument(s) %d: real arguments expected.\n"),"nthroot",2));
22     end
23     
24     // if n is not scalar
25     if (size(n,"*")~=1) then
26         error(msprintf(gettext("%s: Wrong type for input argument(s) %d: n must be a scalar.\n"),"nthroot",1));
27     end
28         
29     reste = modulo(n,2);
30     y = x;
31     
32     // if n = %nan and x is positive then y = %nan
33     if (isnan(n) & or(x >= 0)) then
34         y(find(x>=0)) = %nan;
35     elseif (x==[]) then
36         y = [];
37     elseif (n==0 & (x>=0 | isnan(x))) then
38         // if n = 0 and x = 1 or x = %nan then y = %nan
39         y(find((x==1 | isnan(x)))) = %nan;
40         // if n = 0 and x>1 then y = %inf
41         y(find(x>1)) = %inf;
42         // if n = 0 and x = %eps then y = 0
43         y(find(x==%eps)) = 0;
44     elseif (or (or(x(:)<0) & (n~=fix(n) | reste ==0))) then
45         error(msprintf(gettext("%s: If x is negative, n must be an odd integer\n"),"nthroot"));
46         // if n ~=0 and n ~= %nan
47     elseif (n~=0 & ~isnan(n)) then
48         //if x = 0 and n is negative and n i~= %nan
49         [m1,m2] = size(x(find(x==0 & n<0 & ~isinf(n))));
50         y(find(x==0 & n<0 & ~isinf(n))) = (x(find(x==0 & n<0 & ~isinf(n)))+ones(m1,m2)) .*%inf;
51         //if x = 0 and n is positive and n ~= %nan
52         y(find(x==0 & (n>0 |isinf(n)))) = x(find(x==0 & (n>0 |isinf(n)))).^(1 ./n);
53         // if x is positive
54         y(find(x>0)) = x(find(x>0)).^(1 ./n);
55         // if x is negative
56         y(find(x<0)) = sign(x(find(x<0))).*(abs(x(find(x<0)))).^(1 ./n);
57     end    
58     
59      
60 endfunction
61
62
63
64