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); }
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); }
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))); } }
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(); } } }
public static int Compare(MiniRational u, MiniRational v) { return(u.CompareTo(v)); }
public int CompareTo(MiniRational x) { return((Numerator * x.Denominator).CompareTo(x.Numerator * Denominator)); }
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(); } }
static MiniRational() { var r = new MiniRational(-1, BigInteger.Parse("2000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", NumberStyles.AllowHexSpecifier)); var d = r.ToDouble(); }
public static MiniRational Invert(MiniRational x) { return(new MiniRational(x.Denominator, x.Numerator)); }
public static MiniRational From(MiniRational x) { return(x); }
public RationalDataItem(MiniRational x) { NumeratorValue = x.Numerator; DenominatorValue = x.Denominator; }