elementary_functions module.
[scilab.git] / scilab / modules / elementary_functions / sci_gateway / cpp / sci_frexp.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 "basic_functions.h"
25 }
26
27 /*--------------------------------------------------------------------------*/
28 types::Function::ReturnValue sci_frexp(types::typed_list &in, int _iRetCount, types::typed_list &out)
29 {
30     if (in.size() != 1)
31     {
32         ScierrorW(77, _W("%ls: Wrong number of input argument(s): %d expected.\n"), L"frexp", 1);
33         return types::Function::Error;
34     }
35
36     if (_iRetCount != 2)
37     {
38         ScierrorW(78, _W("%ls: Wrong number of output argument(s): %d expected.\n"), L"frexp", 2);
39         return types::Function::Error;
40     }
41
42     if (in[0]->isDouble() == false)
43     {
44         std::wstring wstFuncName = L"%"  + in[0]->getShortTypeStr() + L"_frexp";
45         return Overload::call(wstFuncName, in, _iRetCount, out, new ExecVisitor());
46     }
47
48     types::Double* pDblIn = in[0]->getAs<types::Double>();
49
50     if (pDblIn->getDims() > 2)
51     {
52         std::wstring wstFuncName = L"%hm_frexp";
53         return Overload::call(wstFuncName, in, _iRetCount, out, new ExecVisitor());
54     }
55
56     if (pDblIn->isComplex())
57     {
58         ScierrorW(999, _W("%ls: Wrong type for input argument #%d : A real matrix expected.\n"), L"frexp", 1);
59         return types::Function::Error;
60     }
61
62     types::Double* pDblCoef = new types::Double(pDblIn->getDims(), pDblIn->getDimsArray());
63     types::Double* pDblExp  = new types::Double(pDblIn->getDims(), pDblIn->getDimsArray());
64
65     for (int i = 0 ; i < pDblIn->getSize() ; i++)
66     {
67         pDblCoef->set(i, dfrexps(pDblIn->get(i), pDblExp->get() + i));
68     }
69
70     out.push_back(pDblCoef);
71     out.push_back(pDblExp);
72
73     return types::Function::OK;
74 }
75 /*--------------------------------------------------------------------------*/