A C/C++ header for parsing and evaluation of arithmetic expressions.
[README file is almost identical to that of the ceval library]
Any valid combination of the following operators and functions, with floating point numbers as operands can be parsed by ceval. Parentheses can be used to override the default operator precedences.
+
(addition), -
(subtraction), *
(multiplication), /
(division), %
(modulo), **
(exponentiation), //
(quotient)
==
(equal), !=
(not equal), <
(strictly less), >
(strictly greater), <=
(less or equal), >=
(greater or equal) to compare the results of two expressions
exp()
, sqrt()
, cbrt()
, sin()
, cos()
, tan()
, asin()
, acos()
, atan()
, sinh()
, cosh()
, tanh()
, abs()
, ceil()
, floor()
, log10()
, ln()
, deg2rad()
, rad2deg()
, signum()
, int()
, frac()
, fact()
pow()
, atan2()
, gcd()
, hcf()
, lcm()
, log()
(generalized log(b, x) to any base b
)
_pi
, _e
...pre-defined constants are prefixed with an underscore
&&
, ||
and !
&
, |
, ^
, <<
, >>
, ~
Other operators
,
(Comma operator) Comma operator returns the result of it's rightmost operand Ex: 2,3
would give 3
; 4,3,0
would be equal to 0
; and cos(_pi/2,_pi/3,_pi)
would return cos(_pi)
i.e, -1
e
(e-operator for scientific notation) Using the binary e
operator, we can use scientific notation in our arithmetic expressions Ex: 0.0314
could be written as 3.14e-2
; 1230000
could be subsituted by 1.23e6
Include the ceval library using the #include "PATH_TO_CEVAL.H"
directive your C/C++ project.
The code snippet given below is a console based interpreter that interactively takes in math expressions from stdin, and prints out their parse trees and results.
//lang=c #include<stdio.h> #include<stdlib.h> #include "ceval.h" int main(int argc, char ** argv) { char expr[100]; while (1) { printf("In = "); fgets(expr, 100, stdin); if (!strcmp(expr, "exit\n")) { break; } else if (!strcmp(expr, "clear\n")) { system("clear"); continue; } else { ceval_tree(expr); printf("\nOut = %f\n\n", ceval_result(expr)); } } return 0; }
In = 3*7**2 2 ** 7 * 3 Out = 147.000000 In = (3.2+2.8)/2 2 / 2.80 + 3.20 Out = 3.000000 In = _e**_pi>_pi**_e 2.72 ** 3.14 > 3.14 ** 2.72 Out = 1.000000 In = 5.4%2 2 % 5.40 Out = 1.400000 In = 5.4//2 2 // 5.40 Out = 2.000000 In = 2*2.0+1.4 1.40 + 2 * 2 Out = 5.400000 In = (5/4+3*-5)+(sin(_pi))**2+(cos(_pi))**2 2 ** 3.14 cos + 2 ** 3.14 sin + 5 - * 3 + 4 / 5 Out = -12.750000 In = 3,4,5,6 6 , 5 , 4 , 3 Out = 6.000000 In = tanh(2/3)==(sinh(2/3)/cosh(2/3)) 3 / 2 cosh / 3 / 2 sinh == 3 / 2 tanh Out = 1.000000 In = (2+3/3+(3+9.7)) 9.70 + 3 + 3 / 3 + 2 Out = 15.700000 In = sin(_pi/2)+cos(_pi/2)+tan(_pi/2) 2 / 3.14 tan + 2 / 3.14 cos + 2 / 3.14 sin [ceval]: tan() is not defined for odd-integral multiples of _pi/2 Out = nan In = asin(2) 2 asin [ceval]: Numerical argument out of domain Out = nan In = exit ... Program finished with exit code 0
When the ceval.h
file is included in a C-program, you might require the -lm
flag to link math.h
gcc file.c -lm