-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathfunctions.cc
74 lines (67 loc) · 2.37 KB
/
functions.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/* -*- C++ -*-
* Copyright (C) 2015 Felix Salfelder
* Author: Felix Salfelder <[email protected]>
*
* This file is part of "Gnucap", the Gnu Circuit Analysis Package
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301, USA.
*------------------------------------------------------------------
* more functions.
*/
#include <math.h>
#include <globals.h>
#include <u_function.h>
#include <u_parameter.h>
#ifndef HAVE_UINT_T
typedef int uint_t;
#endif
#ifndef _U_FUNC
typedef std::string fun_t;
#define to_fun_t to_string
#endif
#define function_plugin(name, expr) \
namespace { \
class FUNC_##name : public FUNCTION { \
public: \
fun_t eval(CS& Cmd, const CARD_LIST* Scope)const override { \
PARAMETER<double> x; \
x.parse(Cmd); \
x.e_val(NOT_INPUT, Scope); \
return to_fun_t(expr); \
} \
} p##name; \
DISPATCHER<FUNCTION>::INSTALL d##name(&function_dispatcher, #name, &p##name); \
}
// exponential and logarithmic functions
// function_plugin(exp, exp(x))
function_plugin(limexp, exp(x)) // uuh
// function_plugin(log10, log10(x))
function_plugin(log2, log2(x))
// function_plugin(ln, log(x))
// inverse trigonometric functions
function_plugin(arccos, acos(x))
function_plugin(arccosec, asin(1./x))
function_plugin(arccot, M_PI_2 - atan(x))
function_plugin(arcsec, acos(1./x))
function_plugin(arcsin, asin(x))
// function_plugin(arctan, arctan); two args. FIXME
// hyperbolic functions
//function_plugin(cosh, cosh(x)) // (exp(x)+exp(-x))*.5)
function_plugin(cosech, 1./sinh(x)) // 2./(exp(x)-exp(-x))
function_plugin(coth, 1.+2./exp(2*x-1)) // cosh(x)/sinh(x)
function_plugin(sech, 2./(exp(x)+exp(-x))) // 1/cosh(x)
//function_plugin(sinh, sinh(x))
//function_plugin(tanh, 1.-2./exp(2*x+1)) // sinh(x)/cosh(x)