public static Expression F(this string str) { var s = str.Split('/'); var top = int.Parse(s.First()); var bot = int.Parse(s.Last()); return(BigRational.FromIntFraction(top, bot)); }
public static BigRational ToFraction(this double x, double error = 0.0000000001) { int num; int den; var n = (int)Math.Floor(x); x -= n; if (x < error) { num = n; den = 1; return(BigRational.FromIntFraction(num, den)); } if (1 - error < x) { num = n + 1; den = 1; return(BigRational.FromIntFraction(num, den)); } var lowerN = 0; var lowerD = 1; var upperN = 1; var upperD = 1; while (true) { var middleN = lowerN + upperN; var middleD = lowerD + upperD; if (middleD * (x + error) < middleN) { upperN = middleN; upperD = middleD; } else if (middleN < (x - error) * middleD) { lowerN = middleN; lowerD = middleD; } else { num = n * middleD + middleN; den = middleD; return(BigRational.FromIntFraction(num, den)); } } //BigRational frac; //if(x % 1 == 0) // if whole number // { // frac = BigRational.FromIntFraction((int) x, 1); //} else { // double dTemp = x; // int iMultiple = 1; // string strTemp = x.ToString(); // while(strTemp.IndexOf("E") > 0) // if in the form like 12E-9 // { // dTemp *= 10; // iMultiple *= 10; // strTemp = dTemp.ToString(); // } // int i = 0; // while(strTemp[i] != '.') // i++; // int iDigitsAfterDecimal = strTemp.Length - i - 1; // while(iDigitsAfterDecimal > 0) { // dTemp *= 10; // iMultiple *= 10; // iDigitsAfterDecimal--; // } // frac = BigRational.FromIntFraction((int) Math.Round(dTemp), iMultiple); //} //return frac; }