예제 #1
0
        static Scalar()
        {
            // This won't inline as nicely on platforms that aren't .NET 5, however there's no other way to yield the
            // constant folding benefits that come with the fields being static readonly.
            //
            // We have used local functions elsewhere to get around this elsewhere, however there's no sane way we can
            // do that with local functions.
            //
            // This will inline fine on .NET 5, though. See also: https://github.com/dotnet/runtime/issues/38106
            if (typeof(T) == typeof(Half))
            {
                Epsilon          = (T)(object)Half.Epsilon;
                MaxValue         = (T)(object)Half.MaxValue;
                MinValue         = (T)(object)Half.MinValue;
                NaN              = (T)(object)Half.NaN;
                NegativeInfinity = (T)(object)Half.NegativeInfinity;
                PositiveInfinity = (T)(object)Half.PositiveInfinity;
                One              = (T)(object)(Half)1;
                Two              = (T)(object)(Half)2;
                MinusOne         = (T)(object)(Half)(-1f);
                MinusTwo         = (T)(object)(Half)(-2f);
                E   = (T)(object)(Half)FloatE;
                Pi  = (T)(object)(Half)FloatPi;
                Tau = (T)(object)(Half)FloatTau;
            }
            else if (typeof(T) == typeof(float))
            {
                Epsilon          = (T)(object)float.Epsilon;
                MaxValue         = (T)(object)float.MaxValue;
                MinValue         = (T)(object)float.MinValue;
                NaN              = (T)(object)float.NaN;
                NegativeInfinity = (T)(object)float.NegativeInfinity;
                PositiveInfinity = (T)(object)float.PositiveInfinity;
                One              = (T)(object)1f;
                Two              = (T)(object)2f;
                MinusOne         = (T)(object)-1f;
                MinusTwo         = (T)(object)-2f;
                E   = (T)(object)FloatE;
                Pi  = (T)(object)FloatPi;
                Tau = (T)(object)FloatTau;
            }
            else if (typeof(T) == typeof(double))
            {
                Epsilon          = (T)(object)double.Epsilon;
                MaxValue         = (T)(object)double.MaxValue;
                MinValue         = (T)(object)double.MinValue;
                NaN              = (T)(object)double.NaN;
                NegativeInfinity = (T)(object)double.NegativeInfinity;
                PositiveInfinity = (T)(object)double.PositiveInfinity;
                One              = (T)(object)1d;
                Two              = (T)(object)2d;
                MinusOne         = (T)(object)-1d;
                MinusTwo         = (T)(object)-2d;
                E  = (T)(object)Math.E;
                Pi = (T)(object)Math.PI;
#if !NET5_0
                Tau = Scalar.Multiply(Pi, Two);
#else
                Tau = (T)(object)Math.Tau;
#endif
            }
            else if (typeof(T) == typeof(decimal))
            {
                Epsilon          = default;
                MaxValue         = (T)(object)decimal.MaxValue;
                MinValue         = (T)(object)decimal.MinValue;
                NaN              = default;
                NegativeInfinity = default;
                PositiveInfinity = default;
                One              = (T)(object)(decimal)1;
                Two              = (T)(object)(decimal)2;
                MinusOne         = (T)(object)(decimal) - 1;
                MinusTwo         = (T)(object)(decimal) - 2;
                E   = (T)(object)(decimal)Math.E;
                Pi  = (T)(object)(decimal)Math.PI;
                Tau = Scalar.Multiply(Pi, Two);
            }
            else if (typeof(T) == typeof(short))
            {
                Epsilon          = default;
                MaxValue         = (T)(object)short.MaxValue;
                MinValue         = (T)(object)short.MinValue;
                NaN              = default;
                NegativeInfinity = default;
                PositiveInfinity = default;
                One              = (T)(object)(short)1;
                Two              = (T)(object)(short)2;
                MinusOne         = (T)(object)(short)-1;
                MinusTwo         = (T)(object)(short)-2;
                E   = (T)(object)(short)FloatE;
                Pi  = (T)(object)(short)FloatPi;
                Tau = (T)(object)(short)FloatTau;
            }
            else if (typeof(T) == typeof(ushort))
            {
                Epsilon          = default;
                MaxValue         = (T)(object)ushort.MaxValue;
                MinValue         = (T)(object)ushort.MinValue;
                NaN              = default;
                NegativeInfinity = default;
                PositiveInfinity = default;
                One              = (T)(object)(ushort)1;
                Two              = (T)(object)(ushort)2;
                MinusOne         = default;
                MinusTwo         = default;
                E   = (T)(object)(ushort)FloatE;
                Pi  = (T)(object)(ushort)FloatPi;
                Tau = (T)(object)(ushort)FloatTau;
            }
            else if (typeof(T) == typeof(sbyte))
            {
                Epsilon          = default;
                MaxValue         = (T)(object)sbyte.MaxValue;
                MinValue         = (T)(object)sbyte.MinValue;
                NaN              = default;
                NegativeInfinity = default;
                PositiveInfinity = default;
                One              = (T)(object)(sbyte)1;
                Two              = (T)(object)(sbyte)2;
                MinusOne         = (T)(object)(sbyte)-1;
                MinusTwo         = (T)(object)(sbyte)-2;
                E   = (T)(object)(sbyte)FloatE;
                Pi  = (T)(object)(sbyte)FloatPi;
                Tau = (T)(object)(sbyte)FloatTau;
            }
            else if (typeof(T) == typeof(byte))
            {
                Epsilon          = default;
                MaxValue         = (T)(object)byte.MaxValue;
                MinValue         = (T)(object)byte.MinValue;
                NaN              = default;
                NegativeInfinity = default;
                PositiveInfinity = default;
                One              = (T)(object)(byte)1;
                Two              = (T)(object)(byte)2;
                MinusOne         = default;
                MinusTwo         = default;
                E   = (T)(object)(byte)FloatE;
                Pi  = (T)(object)(byte)FloatPi;
                Tau = (T)(object)(byte)FloatTau;
            }
            else if (typeof(T) == typeof(int))
            {
                Epsilon          = default;
                MaxValue         = (T)(object)int.MaxValue;
                MinValue         = (T)(object)int.MinValue;
                NaN              = default;
                NegativeInfinity = default;
                PositiveInfinity = default;
                One              = (T)(object)1;
                Two              = (T)(object)2;
                MinusOne         = (T)(object)-1;
                MinusTwo         = (T)(object)-2;
                E   = (T)(object)(int)FloatE;
                Pi  = (T)(object)(int)FloatPi;
                Tau = (T)(object)(int)FloatTau;
            }
            else if (typeof(T) == typeof(uint))
            {
                Epsilon          = default;
                MaxValue         = (T)(object)uint.MaxValue;
                MinValue         = (T)(object)uint.MinValue;
                NaN              = default;
                NegativeInfinity = default;
                PositiveInfinity = default;
                One              = (T)(object)1u;
                Two              = (T)(object)2u;
                MinusOne         = default;
                MinusTwo         = default;
                E   = (T)(object)(uint)FloatE;
                Pi  = (T)(object)(uint)FloatPi;
                Tau = (T)(object)(uint)FloatTau;
            }
            else if (typeof(T) == typeof(long))
            {
                Epsilon          = default;
                MaxValue         = (T)(object)long.MaxValue;
                MinValue         = (T)(object)long.MinValue;
                NaN              = default;
                NegativeInfinity = default;
                PositiveInfinity = default;
                One              = (T)(object)1L;
                Two              = (T)(object)2L;
                MinusOne         = (T)(object)-1L;
                MinusTwo         = (T)(object)-2L;
                E   = (T)(object)(long)FloatE;
                Pi  = (T)(object)(long)FloatPi;
                Tau = (T)(object)(long)FloatTau;
            }
            else if (typeof(T) == typeof(ulong))
            {
                Epsilon          = default;
                MaxValue         = (T)(object)ulong.MaxValue;
                MinValue         = (T)(object)ulong.MinValue;
                NaN              = default;
                NegativeInfinity = default;
                PositiveInfinity = default;
                One              = (T)(object)1ul;
                Two              = (T)(object)2ul;
                MinusOne         = default;
                MinusTwo         = default;
                E   = (T)(object)(ulong)FloatE;
                Pi  = (T)(object)(ulong)FloatPi;
                Tau = (T)(object)(ulong)FloatTau;
            }
            else
            {
                // if it's none of these cases, don't do the general cases.
                return;
            }

            PiOver2          = Scalar.Divide(Pi, Two);
            DegreesPerRadian = Scalar.Divide(Scalar.As <float, T>(180), Pi);
            RadiansPerDegree = Scalar.Divide(Pi, Scalar.As <float, T>(180));
        }