public static NumericValue Sum(IEnumerable<NumericValue> values) { var current = new NumericValue(0); foreach (var value in values) current += value; return current; }
public NumericValue Exp(NumericValue exponentVal) { exponentVal.VerifyNoUnits("Exponent cannot have units."); if (!exponentVal.IsInteger) { VerifyNoUnits("Base can only have units for positive integer exponents."); return new NumericValue(Math.Pow(GetFloat, exponentVal.GetFloat)); } var exponent = exponentVal.IntValue; object result; if ((exponent >= 0) && (IsInteger)) result = BigInteger.Pow(GetInteger, exponent); else result = Math.Pow(GetFloat, exponent); return new NumericValue(result, Units ^ exponent); }
public NumericValue Root(NumericValue rootObj) { VerifyNoUnits(); var root = (int)rootObj.GetInteger; var f = GetFloat; if (root % 2 == 1) // Odd roots return new NumericValue(f >= 0 ? Math.Pow(f, 1.0 / root) : -Math.Pow(-f, 1.0 / root), Units); else if (f >= 0) // Even roots, val >= 0 return new NumericValue(Math.Pow(f, 1.0 / root), Units); throw new Exception("Invalid root"); }
public static string Reduce(NumericValue numerator, NumericValue denominator) { if ((numerator.Units.HasUnits) || (numerator.Units.HasUnits)) throw new Exception("Inputs cannot have units"); var num = numerator.Abs().GetInteger; var den = denominator.Abs().GetInteger; if ((num == 0) || (den == 0)) throw new Exception("Factors cannot be 0"); var gcf = CalcGCF(num, den); return $"{num / gcf}/{den / gcf}"; }
public static NumericValue FromWords(string words) { var ones = new List<string> { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", null, "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" }; var tens = new List<string> { null, "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" }; var magnitudes = new List<string> { null, "thousand", "million", "billion", "trillion", "quadrillion", "quintillion", "sextillion", "septillion", "octillion", "nonillion", "decillion", "undecillion", "duodecillion", "tredecillion", "quattuordecillion", "quindecillion", "sexdecillion", "septdecillion", "octodecillion", "novemdecillion", "vigintillion", "unvigintillion", "duovigintillion", "trevigintillion", "quattuorvigintillion", "quinvigintillion", "sexvigintillion", "septvigintillion", "octovigintillion", "novemvigintillion", "trigintillion", "untrigintillion", "duotrigintillion", "googol", "tretrigintillion", "quattuortrigintillion", "quintrigintillion", "sextrigintillion", "septtrigintillion", "octotrigintillion", "novemtrigintillion", "quadragintillion", "unquadragintillion", "duoquadragintillion", "trequadragintillion", "quattuorquadragintillion", "quinquadragintillion", "sexquadragintillion", "septquadragintillion", "octoquadragintillion", "novemquadragintillion", "quinquagintillion", "unquinquagintillion", "duoquinquagintillion", "trequinquagintillion", "quattuorquinquagintillion", "quinquinquagintillion", "sexquinquagintillion", "septquinquagintillion", "octoquinquagintillion", "novemquinquagintillion", "sexagintillion", "unsexagintillion", "duosexagintillion", "tresexagintillion", "quattuorsexagintillion", "quinsexagintillion", "sexsexagintillion", "septsexagintillion", "octosexagintillion", "novemsexagintillion", "septuagintillion", "unseptuagintillion", "duoseptuagintillion", "treseptuagintillion", "quattuorseptuagintillion", "quinseptuagintillion", "sexseptuagintillion", "septseptuagintillion", "octoseptuagintillion", "novemseptuagintillion", "octogintillion", "unoctogintillion", "duooctogintillion", "treoctogintillion", "quattuoroctogintillion", "quinoctogintillion", "sexoctogintillion", "septoctogintillion", "octooctogintillion", "novemoctogintillion", "nonagintillion", "unnonagintillion", "duononagintillion", "trenonagintillion", "quattuornonagintillion", "quinnonagintillion", "sexnonagintillion", "septnonagintillion", "octononagintillion", "novemnonagintillion", "centillion" }; words = Regex.Replace(Regex.Replace(words.ToLowerInvariant(), "[^0-9.a-z]", " "), "\\s+", " ").Trim(); var tokens = words.Split(' ').Where(str => !string.IsNullOrWhiteSpace(str)).ToList(); double current = 0; var result = new NumericValue(BigInteger.Zero); bool negative = false; using (var itr = tokens.GetEnumerator()) { while (true) { var token = itr.MoveNext() ? itr.Current : null; if (token == "negative") { negative = !negative; continue; } double tokenValue; if ((token != null) && (double.TryParse(token, out tokenValue))) { current += tokenValue; continue; } var onesIndex = token == null ? -1 : ones.IndexOf(token); if (onesIndex != -1) { current += onesIndex; continue; } var tensIndex = token == null ? -1 : tens.IndexOf(token); if (tensIndex != -1) { current += tensIndex * 10; continue; } if (token == "hundred") { current *= 100; continue; } var magnitudesIndex = token == null ? 0 : magnitudes.IndexOf(token); if ((token == null) || (magnitudesIndex != -1)) { var value = new NumericValue(current); var magFactor = new NumericValue(1000); for (var ctr = 0; ctr < magnitudesIndex; ++ctr) value *= magFactor; result += value; current = 0; if (token == null) break; continue; } throw new Exception("Invalid input"); } } if (negative) result = -result; return result; }
public NumericValue Log(NumericValue newBase) { VerifyNoUnits(); return new NumericValue(Math.Log(GetFloat, newBase.GetFloat), Units); }
public static NumericValue Multiple(NumericValue number, NumericValue multiple) { number = GetSameUnits(number, multiple); if ((number.IsInteger) && (multiple.IsInteger)) return new NumericValue((number.GetInteger + multiple.GetInteger - 1) / multiple.GetInteger * multiple.GetInteger, multiple.Units); return new NumericValue(Math.Ceiling(number.GetFloat / multiple.GetFloat) * multiple.GetFloat, multiple.Units); }
public static NumericValue Random(NumericValue minValue, NumericValue maxValue) => new NumericValue(random.Next((int)minValue.GetInteger, (int)maxValue.GetInteger + 1));
public NumericValue SetUnits(NumericValue units) { if (Units.HasUnits) throw new Exception("Already has units"); return new NumericValue(Value, units.Units); }
public NumericValue ConvertUnits(ExpressionUnits units) { var conversion = ExpressionUnitsConversion.GetConversion(Units, units); var mult = new NumericValue(conversion.mult, conversion.toUnits / conversion.fromUnits); var add = new NumericValue(conversion.add, conversion.toUnits); return this * mult + add; }
public NumericValue ShiftRight(NumericValue val2) { val2.VerifyNoUnits(); return new NumericValue(GetInteger >> val2.IntValue, Units); }
static NumericValue GetSameUnits(NumericValue value, NumericValue unitsValue) => value.Units.Equals(unitsValue.Units) ? value : value.ConvertUnits(unitsValue.Units);
public NumericValue IntDiv(NumericValue divisor) => new NumericValue(GetInteger / divisor.GetInteger, Units / divisor.Units);