public static IR.RealNumber operator +(IR.RealNumber a, IQ.RationalNumber b)
            {
                if (a.IsRational)
                {
                    if (a.N == 0)
                    {
                        return(IR.New(b));
                    }
                    else if (b.N == 0)
                    {
                        return(a);
                    }

                    return(IR.New(a.ToRational() + b));
                }

                if (a.Value.Value == 0)
                {
                    return(IR.New(b));
                }
                else if (b.N == 0)
                {
                    return(a);
                }

                return(IR.New(a.Value.Value * b.ApproximateValue));
            }
 public static RealNumber operator /(IR.RealNumber a, IZ.Integer b)
 {
     if (a.IsRational)
     {
         return(New(a.ToRational() / b));
     }
     return(IR.New(a.Value.Value / b.N));
 }
            public static RealNumber operator /(IZ.Integer a, IR.RealNumber b)
            {
                if (b.IsRational)
                {
                    return(New(a / b.ToRational()));
                }

                return(IR.New((decimal)a.N / b.Value.Value));
            }
            public static RealNumber operator *(IR.RealNumber a, IZ.Integer b)
            {
                if (a.IsRational)
                {
                    return(New(a.ToRational() * b));
                }

                return(IR.New(a.Value.Value * (decimal)b.N));
            }
            public static Integer operator +(decimal a, Integer b)
            {
                if (a == 0)
                {
                    return(b);
                }

                return(IR.New(a + (decimal)b.N));
            }
            public static Integer operator /(decimal a, Integer b)
            {
                if (a % 1 == 0)
                {
                    return(IQ.New((int)a, b.N));
                }

                return(IR.New(value: a / (decimal)b.N));
            }
            public static Integer operator /(Integer a, decimal b)
            {
                if (b % 1 == 0)
                {
                    return(IQ.New(a.N, (int)b));
                }

                return(IR.New(value: a.N / (int)b));
            }
            public static Integer operator *(decimal a, Integer b)
            {
                if (a % 1 == 0)
                {
                    return(New((int)a + b.N));
                }

                return(IR.New(a * (decimal)b.N));
            }
            public static RationalNumber operator /(RationalNumber a, decimal b)
            {
                if (a.N == 0)
                {
                    return(GetZeroDivideZeroRational());
                }

                if (b % 1 == 0)
                {
                    return(New(a.N, a.D * (int)b));
                }

                return(IR.New(a.ApproximateValue / b));
            }
            public static RationalNumber operator /(decimal a, RationalNumber b)
            {
                if (a == 0)
                {
                    return(IR.New(GetZeroDivideZeroRational()));
                }

                if (a % 1 == 0)
                {
                    return(New(b.D * (int)a, b.D));
                }

                return(IR.New(a / b.ApproximateValue));
            }
            public static RealNumber operator +(IR.RealNumber a, IZ.Integer b)
            {
                if (a.N == 0)
                {
                    return(New(b));
                }
                else if (b.N == 0)
                {
                    return(a);
                }

                if (a.IsRational)
                {
                    return(New(a.ToRational() + b));
                }

                return(IR.New(a.Value.Value + (decimal)b.N));
            }
            public static RationalNumber operator +(decimal a, RationalNumber b)
            {
                if (a == 0)
                {
                    return(b);
                }

                if (a % 1 == 0)
                {
                    if (b.N == 0)
                    {
                        return(New((int)a));
                    }

                    return(New(((int)a * b.D) + b.N, b.D));
                }

                return(IR.New(a + b.ApproximateValue));
            }
            public static IR.RealNumber operator /(IQ.RationalNumber a, IR.RealNumber b)
            {
                if (b.IsRational)
                {
                    if (a.N == 0)
                    {
                        return(IR.New(IQ.GetZeroDivideZeroRational()));
                    }

                    return(IR.New(a / b.ToRational()));
                }

                if (a.N == 0)
                {
                    return(IR.New(value: 0));
                }

                return(IR.New(value: a.ApproximateValue / b.Value.Value));
            }