elementary_functions module.
[scilab.git] / scilab / modules / elementary_functions / sci_gateway / cpp / sci_atan.cpp
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - DIGITEO - Cedric DELAMARRE
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12 /*--------------------------------------------------------------------------*/
13 #include "elem_func_gw.hxx"
14 #include "function.hxx"
15 #include "double.hxx"
16 #include "overload.hxx"
17 #include "execvisitor.hxx"
18
19
20 extern "C"
21 {
22 #include "Scierror.h"
23 #include "localization.h"
24 #include "tan.h"
25 #include "abs.h"
26 }
27
28 /*--------------------------------------------------------------------------*/
29 types::Function::ReturnValue sci_atan(types::typed_list &in, int _iRetCount, types::typed_list &out)
30 {
31     types::Double* pDblX   = NULL;
32     types::Double* pDblY   = NULL;
33     types::Double* pDblOut = NULL;
34
35     if (in.size() < 1 || in.size() > 2)
36     {
37         ScierrorW(77, _W("%ls: Wrong number of input argument(s): %d to %d expected.\n"), L"atan", 1, 2);
38         return types::Function::Error;
39     }
40
41     if (_iRetCount > 1)
42     {
43         ScierrorW(78, _W("%ls: Wrong number of output argument(s): %d expected.\n"), L"atan", 1);
44         return types::Function::Error;
45     }
46
47     if (in[0]->isDouble() == false)
48     {
49         std::wstring wstFuncName = L"%"  + in[0]->getShortTypeStr() + L"_atan";
50         return Overload::call(wstFuncName, in, _iRetCount, out, new ExecVisitor());
51     }
52
53     pDblX = in[0]->getAs<types::Double>();
54
55     if (in.size() == 1)
56     {
57         if (pDblX->isComplex())
58         {
59             pDblOut = new types::Double(pDblX->getDims(), pDblX->getDimsArray(), true);
60             for (int i = 0 ; i < pDblX->getSize() ; i++)
61             {
62                 if (pDblX->get(i) == 0 && dabss(pDblX->getImg(i)) == 1)
63                 {
64                     ScierrorW(999, _W("%ls: Wrong value for input argument #%d : Singularity of the fonction.\n"), L"atan", 1);
65                     return types::Function::Error;
66                 }
67
68                 watan(pDblX->get(i), pDblX->getImg(i), pDblOut->get() + i, pDblOut->getImg() + i);
69             }
70         }
71         else
72         {
73             pDblOut = new types::Double(pDblX->getDims(), pDblX->getDimsArray(), false);
74             for (int i = 0 ; i < pDblX->getSize() ; i++)
75             {
76                 pDblOut->set(i, datans(pDblX->get(i)));
77             }
78         }
79     }
80     else // in.size() == 2
81     {
82         pDblY = in[1]->getAs<types::Double>();
83
84         if (pDblX->isComplex() || pDblY->isComplex())
85         {
86             ScierrorW(999, _W("%ls: Wrong type for input argument #%d : A real matrix expected.\n"), L"atan", 2);
87             return types::Function::Error;
88         }
89
90         if (pDblX->getSize() != pDblY->getSize())
91         {
92             ScierrorW(999, _W("%ls: Wrong size for input argument #%d and #%d: Same size expected.\n"), L"atan", 1, 2);
93             return types::Function::Error;
94         }
95
96         pDblOut = new types::Double(pDblX->getDims(), pDblX->getDimsArray(), false);
97         for (int i = 0 ; i < pDblX->getSize() ; i++)
98         {
99             pDblOut->set(i, datan2s(pDblX->get(i), pDblY->get(i)));
100         }
101     }
102
103     out.push_back(pDblOut);
104     return types::Function::OK;
105 }
106 /*--------------------------------------------------------------------------*/