[elementary_functions] fix argument check in log1p from < 0 to <= -1
[scilab.git] / scilab / modules / elementary_functions / sci_gateway / cpp / sci_log1p.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 "sciprint.h"
24 #include "localization.h"
25 #include "elem_common.h"
26 #include "log.h"
27 }
28
29 /*
30 clear a;nb = 2500;a = rand(nb, nb);tic();log1p(a);toc
31 */
32 /*--------------------------------------------------------------------------*/
33 types::Function::ReturnValue sci_log1p(types::typed_list &in, int _iRetCount, types::typed_list &out)
34 {
35     int iAlert = 1;
36
37     if (in.size() != 1)
38     {
39         Scierror(77, _("%s: Wrong number of input argument(s): %d to %d expected.\n"), "log1p", 1);
40         return types::Function::Error;
41     }
42
43     if (_iRetCount > 1)
44     {
45         Scierror(78, _("%s: Wrong number of output argument(s): %d expected.\n"), "log1p", 1);
46         return types::Function::Error;
47     }
48
49     if (in[0]->isDouble() == false)
50     {
51         ast::ExecVisitor exec;
52         std::wstring wstFuncName = L"%" + in[0]->getShortTypeStr() + L"_log1p";
53         return Overload::call(wstFuncName, in, _iRetCount, out, &exec);
54     }
55
56     types::Double* pDblIn = in[0]->getAs<types::Double>();
57
58     if (pDblIn->isComplex())
59     {
60         Scierror(999, _("%s: Wrong type for input argument #%d: A real expected.\n"), "log1p", 1);
61         return types::Function::Error;
62     }
63
64     double* pInR = pDblIn->get();
65     int size = pDblIn->getSize();
66     for (int i = 0; i < size; i++)
67     {
68         if (pInR[i] <= -1)
69         {
70             if (ConfigVariable::getIeee() == 0)
71             {
72                 Scierror(999, _("%s: Wrong value for input argument #%d : Singularity of the function.\n"), "log1p", 1);
73                 return types::Function::Error;
74             }
75             else if (ConfigVariable::getIeee() == 1)
76             {
77                 if (ConfigVariable::getWarningMode())
78                 {
79                     sciprint(_("%s: Warning: Wrong value for input argument #%d : Singularity of the function.\n"), "log1p", 1);
80                     break;
81                 }
82             }
83         }
84     }
85
86     types::Double* pDblOut = new types::Double(pDblIn->getDims(), pDblIn->getDimsArray());
87     double* pOutR = pDblOut->get();
88
89     for (int i = 0; i < size; i++)
90     {
91         pOutR[i] = dlog1ps(pInR[i]);
92     }
93
94     out.push_back(pDblOut);
95     return types::Function::OK;
96 }
97 /*--------------------------------------------------------------------------*/