diff --git a/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs b/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs index b729b28..c528079 100644 --- a/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs +++ b/ClosedXML/Excel/CalcEngine/Functions/MathTrig.cs @@ -66,6 +66,7 @@ ce.RegisterFunction("ROUNDDOWN", 2, RoundDown); ce.RegisterFunction("ROUNDUP", 1, 2, RoundUp); ce.RegisterFunction("SEC", 1, Sec); + ce.RegisterFunction("SECH", 1, Sech); ce.RegisterFunction("SERIESSUM", 4, SeriesSum); ce.RegisterFunction("SIGN", 1, Sign); ce.RegisterFunction("SIN", 1, Sin); @@ -751,6 +752,11 @@ throw new CellValueException(); } + private static object Sech(List p) + { + return 1.0 / Math.Cosh(p[0]); + } + private static object SeriesSum(List p) { var x = (Double)p[0]; diff --git a/ClosedXML_Tests/Excel/CalcEngine/MathTrigTests.cs b/ClosedXML_Tests/Excel/CalcEngine/MathTrigTests.cs index 51c4207..5d258b4 100644 --- a/ClosedXML_Tests/Excel/CalcEngine/MathTrigTests.cs +++ b/ClosedXML_Tests/Excel/CalcEngine/MathTrigTests.cs @@ -404,6 +404,32 @@ @"SEC(number)"))); } + [TestCase(-9, 0.00024682)] + [TestCase(-8, 0.000670925)] + [TestCase(-7, 0.001823762)] + [TestCase(-6, 0.004957474)] + [TestCase(-5, 0.013475282)] + [TestCase(-4, 0.036618993)] + [TestCase(-3, 0.099327927)] + [TestCase(-2, 0.265802229)] + [TestCase(-1, 0.648054274)] + [TestCase(0, 1)] + public void Sech_ReturnsCorrectNumber(double input, double expectedOutput) + { + double result = (double)XLWorkbook.EvaluateExpr( + string.Format( + @"SECH({0})", + input.ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expectedOutput, result, 0.00001); + + // as the secant is symmetric for positive and negative numbers, let's assert twice: + double resultForNegative = (double)XLWorkbook.EvaluateExpr( + string.Format( + @"SECH({0})", + (-input).ToString(CultureInfo.InvariantCulture))); + Assert.AreEqual(expectedOutput, resultForNegative, 0.00001); + } + /// /// refers to Example 1 from the Excel documentation, ///