Beispiel #1
0
		public static NumericValue Sum(IEnumerable<NumericValue> values)
		{
			var current = new NumericValue(0);
			foreach (var value in values)
				current += value;
			return current;
		}
Beispiel #2
0
		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);
		}
Beispiel #3
0
		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");
		}
Beispiel #4
0
		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}";
		}
Beispiel #5
0
		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;
		}
Beispiel #6
0
		public NumericValue Log(NumericValue newBase)
		{
			VerifyNoUnits();
			return new NumericValue(Math.Log(GetFloat, newBase.GetFloat), Units);
		}
Beispiel #7
0
		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);
		}
Beispiel #8
0
		public static NumericValue Random(NumericValue minValue, NumericValue maxValue) => new NumericValue(random.Next((int)minValue.GetInteger, (int)maxValue.GetInteger + 1));
Beispiel #9
0
		public NumericValue SetUnits(NumericValue units)
		{
			if (Units.HasUnits)
				throw new Exception("Already has units");
			return new NumericValue(Value, units.Units);
		}
Beispiel #10
0
		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;
		}
Beispiel #11
0
		public NumericValue ShiftRight(NumericValue val2)
		{
			val2.VerifyNoUnits();
			return new NumericValue(GetInteger >> val2.IntValue, Units);
		}
Beispiel #12
0
		static NumericValue GetSameUnits(NumericValue value, NumericValue unitsValue) => value.Units.Equals(unitsValue.Units) ? value : value.ConvertUnits(unitsValue.Units);
Beispiel #13
0
		public NumericValue IntDiv(NumericValue divisor) => new NumericValue(GetInteger / divisor.GetInteger, Units / divisor.Units);