Skip to content

Commit 81bffbe

Browse files
author
linzhijun
committed
fix
1 parent 055160b commit 81bffbe

24 files changed

Lines changed: 4953 additions & 3281 deletions

csharp/ToolGood.Algorithm.Test/AlgorithmEngine/AlgorithmEngineTest_flow.cs

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using PetaTest;
1+
using PetaTest;
22

33
namespace ToolGood.Algorithm.Test
44
{
@@ -259,5 +259,63 @@ public void andor_Test()
259259
//t = engine.TryEvaluate("1=1 or 2!=2", false);
260260
//Assert.AreEqual(true, t);
261261
}
262+
263+
[Test]
264+
public void IFS_test()
265+
{
266+
AlgorithmEngine engine = new AlgorithmEngine();
267+
var t = engine.TryEvaluate("IFS(1=1, 'a', 1=2, 'b')", "");
268+
Assert.AreEqual("a", t);
269+
270+
t = engine.TryEvaluate("IFS(1=2, 'a', 2=2, 'b')", "");
271+
Assert.AreEqual("b", t);
272+
273+
274+
var t2 = engine.TryEvaluate("IFS(1=1, 100, 1=2, 200)", 0);
275+
Assert.AreEqual(100, t2);
276+
}
277+
278+
[Test]
279+
public void SWITCH_test()
280+
{
281+
AlgorithmEngine engine = new AlgorithmEngine();
282+
var t = engine.TryEvaluate("SWITCH(1, 1, 'one', 2, 'two')", "");
283+
Assert.AreEqual("one", t);
284+
285+
t = engine.TryEvaluate("SWITCH(2, 1, 'one', 2, 'two')", "");
286+
Assert.AreEqual("two", t);
287+
288+
var t2 = engine.TryEvaluate("SWITCH('a', 'a', 1, 'b', 2)", 0);
289+
Assert.AreEqual(1, t2);
290+
291+
t = engine.TryEvaluate("SWITCH(5, 1, 'one', 2, 'two')", "");
292+
Assert.AreEqual("", t);
293+
}
294+
295+
[Test]
296+
public void XOR_test()
297+
{
298+
AlgorithmEngine engine = new AlgorithmEngine();
299+
var t = engine.TryEvaluate("XOR(true(), false())", false);
300+
Assert.AreEqual(true, t);
301+
302+
t = engine.TryEvaluate("XOR(true(), true())", true);
303+
Assert.AreEqual(false, t);
304+
305+
t = engine.TryEvaluate("XOR(false(), false())", true);
306+
Assert.AreEqual(false, t);
307+
308+
t = engine.TryEvaluate("XOR(true(), true(), true())", false);
309+
Assert.AreEqual(true, t);
310+
311+
t = engine.TryEvaluate("XOR(true(), false(), false())", false);
312+
Assert.AreEqual(true, t);
313+
314+
t = engine.TryEvaluate("XOR(1, 0)", false);
315+
Assert.AreEqual(true, t);
316+
317+
t = engine.TryEvaluate("XOR(1, 1)", true);
318+
Assert.AreEqual(false, t);
319+
}
262320
}
263321
}

csharp/ToolGood.Algorithm.Test/AlgorithmEngine/AlgorithmEngineTest_math.cs

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -589,5 +589,126 @@ public void transformation_test()
589589
}
590590

591591
#endregion 转化 transformation
592+
593+
#region 工程函数
594+
595+
[Test]
596+
public void ERF_test()
597+
{
598+
AlgorithmEngine engine = new AlgorithmEngine();
599+
var t = engine.TryEvaluate("ERF(0)", 0.0);
600+
Assert.AreEqual(0.0, Math.Round(t, 6));
601+
602+
t = engine.TryEvaluate("ERF(1)", 0.0);
603+
t = Math.Round(t, 6);
604+
Assert.AreEqual(0.842701, t);
605+
606+
t = engine.TryEvaluate("ERF(-1)", 0.0);
607+
t = Math.Round(t, 6);
608+
Assert.AreEqual(-0.842701, t);
609+
}
610+
611+
[Test]
612+
public void ERFC_test()
613+
{
614+
AlgorithmEngine engine = new AlgorithmEngine();
615+
var t = engine.TryEvaluate("ERFC(0)", 0.0);
616+
Assert.AreEqual(1.0, Math.Round(t, 6));
617+
618+
t = engine.TryEvaluate("ERFC(1)", 0.0);
619+
t = Math.Round(t, 6);
620+
Assert.AreEqual(0.157299, t);
621+
}
622+
623+
[Test]
624+
public void DELTA_test()
625+
{
626+
AlgorithmEngine engine = new AlgorithmEngine();
627+
var t = engine.TryEvaluate("DELTA(5, 5)", 0.0);
628+
Assert.AreEqual(1.0, t);
629+
630+
t = engine.TryEvaluate("DELTA(5, 4)", 0.0);
631+
Assert.AreEqual(0.0, t);
632+
633+
t = engine.TryEvaluate("DELTA(5)", 0.0);
634+
Assert.AreEqual(0.0, t);
635+
636+
t = engine.TryEvaluate("DELTA(0)", 0.0);
637+
Assert.AreEqual(1.0, t);
638+
}
639+
640+
[Test]
641+
public void GESTEP_test()
642+
{
643+
AlgorithmEngine engine = new AlgorithmEngine();
644+
var t = engine.TryEvaluate("GESTEP(5, 4)", 0.0);
645+
Assert.AreEqual(1.0, t);
646+
647+
t = engine.TryEvaluate("GESTEP(5, 5)", 0.0);
648+
Assert.AreEqual(1.0, t);
649+
650+
t = engine.TryEvaluate("GESTEP(5, 6)", 0.0);
651+
Assert.AreEqual(0.0, t);
652+
653+
t = engine.TryEvaluate("GESTEP(5)", 0.0);
654+
Assert.AreEqual(1.0, t);
655+
656+
t = engine.TryEvaluate("GESTEP(-1)", 0.0);
657+
Assert.AreEqual(0.0, t);
658+
}
659+
660+
[Test]
661+
public void BESSELI_test()
662+
{
663+
AlgorithmEngine engine = new AlgorithmEngine();
664+
var t = engine.TryEvaluate("BESSELI(1.5, 1)", 0.0);
665+
t = Math.Round(t, 6);
666+
Assert.AreEqual(0.981666, t);
667+
668+
t = engine.TryEvaluate("BESSELI(1.5, 0)", 0.0);
669+
t = Math.Round(t, 6);
670+
Assert.AreEqual(1.646723, t);
671+
}
672+
673+
[Test]
674+
public void BESSELJ_test()
675+
{
676+
AlgorithmEngine engine = new AlgorithmEngine();
677+
var t = engine.TryEvaluate("BESSELJ(1.5, 1)", 0.0);
678+
t = Math.Round(t, 6);
679+
Assert.AreEqual(0.557937, t);
680+
681+
t = engine.TryEvaluate("BESSELJ(1.5, 0)", 0.0);
682+
t = Math.Round(t, 6);
683+
Assert.AreEqual(0.511828, t);
684+
}
685+
686+
[Test]
687+
public void BESSELK_test()
688+
{
689+
AlgorithmEngine engine = new AlgorithmEngine();
690+
var t = engine.TryEvaluate("BESSELK(1.5, 1)", 0.0);
691+
t = Math.Round(t, 3);
692+
Assert.AreEqual(0.277, t, 0.01);
693+
694+
t = engine.TryEvaluate("BESSELK(1.5, 0)", 0.0);
695+
t = Math.Round(t, 3);
696+
Assert.AreEqual(0.214, t, 0.01);
697+
}
698+
699+
[Test]
700+
public void BESSELY_test()
701+
{
702+
AlgorithmEngine engine = new AlgorithmEngine();
703+
var t = engine.TryEvaluate("BESSELY(1.5, 1)", 0.0);
704+
t = Math.Round(t, 3);
705+
Assert.AreEqual(-0.412, t, 0.01);
706+
707+
t = engine.TryEvaluate("BESSELY(2.5, 0)", 0.0);
708+
t = Math.Round(t, 3);
709+
Assert.AreEqual(0.498, t, 0.01);
710+
}
711+
712+
#endregion 工程函数
592713
}
593714
}

csharp/ToolGood.Algorithm/Internals/Functions/Financial/Function_MIRR.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ public override Operand Evaluate(AlgorithmEngine engine, Func<AlgorithmEngine, s
4343
if (npvNegative == 0) return Div0Error();
4444

4545
var mirr = Math.Pow((double)(-npvPositive / npvNegative), 1.0 / (n - 1)) - 1;
46-
return Operand.Create((decimal)mirr);
46+
return Operand.Create(mirr);
4747
}
4848
}
4949
}

csharp/ToolGood.Algorithm/Internals/Functions/Financial/Function_NPER.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public override Operand Evaluate(AlgorithmEngine engine, Func<AlgorithmEngine, s
4949
}
5050

5151
var nper = Math.Log((double)(-fv * rate + factor) / (double)(pv * rate + factor)) / Math.Log((double)(1 + rate));
52-
return Operand.Create((decimal)nper);
52+
return Operand.Create(nper);
5353
}
5454
}
5555
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using System;
2+
using System.Text;
3+
4+
namespace ToolGood.Algorithm.Internals.Functions.Flow
5+
{
6+
internal sealed class Function_IFS : Function_N
7+
{
8+
public Function_IFS(FunctionBase[] funcs) : base(funcs)
9+
{
10+
}
11+
12+
public override string Name => "Ifs";
13+
14+
public override Operand Evaluate(AlgorithmEngine engine, Func<AlgorithmEngine, string, Operand> tempParameter)
15+
{
16+
for(int i = 0; i < funcs.Length - 1; i += 2) {
17+
var condition = GetBoolean(engine, tempParameter, i);
18+
if(condition.IsError) { return condition; }
19+
if(condition.BooleanValue) {
20+
return funcs[i + 1].Evaluate(engine, tempParameter);
21+
}
22+
}
23+
if(funcs.Length % 2 == 1) {
24+
return funcs[funcs.Length - 1].Evaluate(engine, tempParameter);
25+
}
26+
return Operand.Error("#N/A");
27+
}
28+
}
29+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
using System;
2+
using System.Text;
3+
4+
namespace ToolGood.Algorithm.Internals.Functions.Flow
5+
{
6+
internal sealed class Function_SWITCH : Function_N
7+
{
8+
public Function_SWITCH(FunctionBase[] funcs) : base(funcs)
9+
{
10+
}
11+
12+
public override string Name => "Switch";
13+
14+
public override Operand Evaluate(AlgorithmEngine engine, Func<AlgorithmEngine, string, Operand> tempParameter)
15+
{
16+
if(funcs.Length < 3) {
17+
return Operand.Error("#VALUE!");
18+
}
19+
var exprValue = funcs[0].Evaluate(engine, tempParameter);
20+
if(exprValue.IsError) { return exprValue; }
21+
22+
int i = 1;
23+
while(i < funcs.Length - 1) {
24+
var compareValue = funcs[i].Evaluate(engine, tempParameter);
25+
if(compareValue.IsError) { return compareValue; }
26+
27+
if(EqualsOperand(exprValue, compareValue)) {
28+
return funcs[i + 1].Evaluate(engine, tempParameter);
29+
}
30+
i += 2;
31+
}
32+
33+
if(funcs.Length % 2 == 0) {
34+
return funcs[funcs.Length - 1].Evaluate(engine, tempParameter);
35+
}
36+
return Operand.Error("#N/A");
37+
}
38+
39+
private bool EqualsOperand(Operand a, Operand b)
40+
{
41+
if(a.IsNumber && b.IsNumber) {
42+
return a.NumberValue == b.NumberValue;
43+
}
44+
if(a.IsText && b.IsText) {
45+
return a.TextValue == b.TextValue;
46+
}
47+
if(a.IsBoolean && b.IsBoolean) {
48+
return a.BooleanValue == b.BooleanValue;
49+
}
50+
if(a.IsNull && b.IsNull) {
51+
return true;
52+
}
53+
return false;
54+
}
55+
}
56+
}

0 commit comments

Comments
 (0)