Пример #1
0
        private static BigInteger ToBigInt_Imp(MiniRational x)
        {
            int        sign;
            BigInteger n;
            BigInteger d;

            if (x.Numerator >= 0)
            {
                sign = 1;
                n    = x.Numerator;
                d    = x.Denominator;
            }
            else
            {
                sign = -1;
                n    = -x.Numerator;
                d    = x.Denominator;
            }

            // Truncate する
            var int_part  = n / d;
            var frac_part = new MiniRational(n - int_part * d, d);

            if (frac_part < 0 || frac_part >= 1)
            {
                throw new ApplicationException();
            }
            return(sign * int_part);
        }
Пример #2
0
        public static bool TryParse(string s, NumberStyles style, IFormatProvider provider, out MiniRational value)
        {
            decimal value_double;
            var     result = decimal.TryParse(s, style, provider, out value_double);

            value = new MiniRational(value_double);
            return(result);
        }
Пример #3
0
 public static MiniRational Pow(MiniRational x, int n)
 {
     if (n >= 0)
     {
         return(new MiniRational(BigInteger.Pow(x.Numerator, n), BigInteger.Pow(x.Denominator, n)));
     }
     else
     {
         return(new MiniRational(BigInteger.Pow(x.Denominator, -n), BigInteger.Pow(x.Numerator, -n)));
     }
 }
Пример #4
0
        static void Main(string[] args)
        {
#if true
            // 10,03,04,00,ca,9a,3b,01,08,ff,ff,e7,89,04,23,c7,8a

            var m = new MiniRational(0x3b9aca00, 0x8ac7230489e7ffff);
            var d = m.ToDecimal();
#endif

            var lock_obj         = new object();
            var current_assembly = typeof(Program).Assembly;
            var interface_name   = typeof(ITestDataRendererPlugin).FullName;
            var plugins          = current_assembly.GetTypes()
                                   .Where(t => t.IsClass /*&& t.IsPublic */ && !t.IsAbstract && t.GetInterface(interface_name) != null)
                                   .Select(t => (ITestDataRendererPlugin)current_assembly.CreateInstance(t.FullName));


            var 重複確認用コレクション = plugins
                              .GroupBy(item => item.DataFileKey)
                              .Select(g => new { key = g.Key, count = g.Count() })
                              .Where(item => item.count != 1);
            foreach (var item in 重複確認用コレクション)
            {
                Console.WriteLine(string.Format("***プラグインが重複しています。: {0}", item.key));
                Console.ReadLine();
                return;
            }
            var is_parallel = false;
            if (is_parallel)
            {
                var options = new ParallelOptions();
                options.MaxDegreeOfParallelism = 8;
                Parallel.ForEach(plugins /*.Where(plugin => plugin.DataFileName.StartsWith("test_data_tostring"))*/, options, plugin =>
                {
                    lock (lock_obj)
                    {
                        Console.WriteLine(string.Format("{0}...", plugin.DataFileKey));
                    }
                    plugin.Render();
                });
            }
            else
            {
                foreach (var plugin in plugins /*.Where(plugin => plugin.DataFileKey.Contains("to") || plugin.DataFileKey.Contains("from"))*/)
                {
                    lock (lock_obj)
                    {
                        Console.WriteLine(string.Format("{0}...", plugin.DataFileKey));
                    }
                    plugin.Render();
                }
            }
        }
Пример #5
0
 public static int Compare(MiniRational u, MiniRational v)
 {
     return(u.CompareTo(v));
 }
Пример #6
0
 public int CompareTo(MiniRational x)
 {
     return((Numerator * x.Denominator).CompareTo(x.Numerator * Denominator));
 }
Пример #7
0
        public BigInteger Round(int mode)
        {
            var x    = this;
            var n    = x.Numerator;
            var d    = x.Denominator;
            int sign = 1;

            if (n < 0)
            {
                sign = -1;
                n    = -n;
            }
            var int_part  = n / d;
            var frac_part = new MiniRational(n, d) - int_part;

            if (frac_part < 0 || frac_part >= 1)
            {
                throw new ApplicationException();
            }
            var half        = new MiniRational(1, 2);
            var lower_value = int_part;
            var upper_value = frac_part > 0 ? int_part + 1 : int_part;


            switch (mode)
            {
            case 0:         // 数値が 2 つの数値の中間に位置する場合、最も近い偶数方向に丸められる。
                if (frac_part < half)
                {
                    return(sign * lower_value);
                }
                else if (frac_part > half)
                {
                    return(sign * upper_value);
                }
                else if (lower_value.IsEven)
                {
                    return(sign * lower_value);
                }
                else
                {
                    return(sign * upper_value);
                }

            case 1:         // 数値が 2 つの数値の中間に位置する場合、0 から遠い方の近似値に丸められる。
                if (frac_part < half)
                {
                    return(sign * lower_value);
                }
                else
                {
                    return(sign * upper_value);
                }

            case 1001:      // 正の無限大に近づくように丸められる。
                return(sign >= 0 ? sign * upper_value : sign *lower_value);

            case 1002:      // 0 に近づくように丸められる。
                return(sign * lower_value);

            case 1003:      // 負の無限大に近づくように丸められる。
                return(sign >= 0 ? sign * lower_value : sign *upper_value);

            case 1004:      // 数値が 2 つの数値の中間に位置する場合、0 から近い方の近似値に丸められる。
                if (frac_part <= half)
                {
                    return(sign * lower_value);
                }
                else
                {
                    return(sign * upper_value);
                }

            case 1005:      // 0 から離れるように丸められる。
                return(sign * upper_value);

            default:
                throw new ApplicationException();
            }
        }
Пример #8
0
 static MiniRational()
 {
     var r = new MiniRational(-1, BigInteger.Parse("2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", NumberStyles.AllowHexSpecifier));
     var d = r.ToDouble();
 }
Пример #9
0
 public static MiniRational Invert(MiniRational x)
 {
     return(new MiniRational(x.Denominator, x.Numerator));
 }
Пример #10
0
 public static MiniRational From(MiniRational x)
 {
     return(x);
 }
Пример #11
0
 public RationalDataItem(MiniRational x)
 {
     NumeratorValue   = x.Numerator;
     DenominatorValue = x.Denominator;
 }