using System; namespace Cobilas.Numeric { /// Basic functions of mathematical operations. public class BasicCalculation : CalculationsCollection { /// public override MathOperator[] Calculations { get; protected set; } = Array.Empty(); /// public override MathOperator[] OverwriteCalculations { get; protected set; } = Array.Empty(); /// public override void Initialization() { Calculations = new MathOperator[] { new MathOperator("~-", Negative, SignalOrientation.right), new MathOperator("++", S_Add, SignalOrientation.left, 2), new MathOperator("--", S_Subtraction, SignalOrientation.left, 2), new MathOperator("**", S_Multiplication, SignalOrientation.left, 1), new MathOperator("//", S_Division, SignalOrientation.left, 1), new MathOperator("%%", S_Module, SignalOrientation.left, 1), new MathOperator('+', Add, SignalOrientation.both, 2), new MathOperator('-', Subtraction, SignalOrientation.both, 2), new MathOperator('*', Multiplication, SignalOrientation.both, 1), new MathOperator('/', Division, SignalOrientation.both, 1), new MathOperator('%', Module, SignalOrientation.both, 1), new MathOperator(":pow:", Pow, SignalOrientation.both), new MathOperator(":sqr:", Sqrt, SignalOrientation.right), new MathOperator(":cos:", Cos, SignalOrientation.right), new MathOperator(":acos:", Acos, SignalOrientation.right), new MathOperator(":sin:", Sin, SignalOrientation.right), new MathOperator(":asin:", Asin, SignalOrientation.right), new MathOperator(":log:", Log, SignalOrientation.right), new MathOperator(":log-nb:", Log_nb, SignalOrientation.both), new MathOperator(":log10:", Log10, SignalOrientation.right) }; } /// public override double Clac(double V1, string S, double V2) { foreach (var item in Calculations) if (item.Signal == S) return (double)item.Function.DynamicInvoke(V1, V2); return 0d; } private double Add(double a, double b) => a + b; private double Subtraction(double a, double b) => a - b; private double Multiplication(double a, double b) => a * b; private double Division(double a, double b) => a / b; private double Module(double a, double b) => a % b; private double Negative(double a, double b) => -b; private double S_Add(double a, double b) => a + 1; private double S_Subtraction(double a, double b) => a - 1; private double S_Multiplication(double a, double b) => a * 2; private double S_Division(double a, double b) => a / 2; private double S_Module(double a, double b) => a % 2; private double Pow(double a, double b) => Math.Pow(a, b); private double Sqrt(double a, double b) => Math.Sqrt(b); private double Cos(double a, double b) => Math.Cos(b); private double Acos(double a, double b) => Math.Acos(b); private double Sin(double a, double b) => Math.Sin(b); private double Asin(double a, double b) => Math.Asin(b); private double Log(double a, double b) => Math.Log(b); private double Log_nb(double a, double b) => Math.Log(a, b); private double Log10(double a, double b) => Math.Log10(b); } }