Esempio n. 1
0
            internal static bool TryPulling(TrigTable table, ComplexNumber arg, out Entity res)
            {
                if (arg.IsImaginary())
                {
                    res = null;
                    return(false);
                }
                // arg in [0; 2pi]
                var dArg = arg.Real.Value;

                EDecimal Remainder(EDecimal a, EDecimal divisor)
                => a.RemainderNoRoundAfterDivide(divisor, MathS.Settings.DecimalPrecisionContext);

                var twoPi = RealNumber.CtxMultiply(2, MathS.DecimalConst.pi);

                dArg = Remainder(
                    RealNumber.CtxAdd(       // (
                        Remainder(dArg       //     dArg
                                  ,          //     %
                                  twoPi)     //     2pi
                        ,                    //   +
                        twoPi                //   2pi
                        )                    // )
                    ,                        // %
                    twoPi                    // 2pi
                    );

                int begin = 0;
                int end   = table.Count - 1;

                while (end - begin > 1)
                {
                    var mid = (end + begin) / 2;
                    if (EDecimalWrapper.IsGreater(table[mid].arg, dArg))
                    {
                        begin = mid;
                    }
                    else
                    {
                        end = mid;
                    }
                    if (end >= table.Count)
                    {
                        res = null;
                        return(false);
                    }
                }

                for (var j = begin; j <= end; j++)
                {
                    if (Number.Functional.IsZero(table[j].arg - dArg))
                    {
                        res = table[j].res;
                        return(true);
                    }
                }
                res = null;
                return(false);
            }
Esempio n. 2
0
            internal static bool TryPulling(TrigTable table, ComplexNumber arg, out Entity res)
            {
                if (arg.IsImaginary())
                {
                    res = null;
                    return(false);
                }
                // arg in [0; 2pi]
                var dArg = arg.Real.Value;

                dArg = (dArg % (2 * MathS.DecimalConst.pi) + 2 * MathS.DecimalConst.pi) % (2 * MathS.DecimalConst.pi);

                int begin = 0;
                int end   = table.Count - 1;

                while (end - begin > 1)
                {
                    var mid = (end + begin) / 2;
                    if (table[mid].arg > dArg)
                    {
                        begin = mid;
                    }
                    else
                    {
                        end = mid;
                    }
                    if (end >= table.Count)
                    {
                        res = null;
                        return(false);
                    }
                }

                for (var j = begin; j <= end; j++)
                {
                    if (Number.Functional.IsZero(table[j].arg - dArg))
                    {
                        res = table[j].res;
                        return(true);
                    }
                }
                res = null;
                return(false);
            }
Esempio n. 3
0
 private static bool TryPulling(TrigTable table, Complex arg,
                                [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out Entity?res)
 {
     if (!(arg is Real {
         EDecimal : var dArg
     }))