public static void Main(String[] args) { //multiple ways to construct a BigFloat BigFloat bigfloat1 = new BigFloat(1234567); BigFloat bigfloat2 = new BigFloat("1234567"); BigFloat bigfloat3 = new BigFloat(1234567.0); BigFloat bigfloat4 = BigFloat.Parse("1234567.123"); Console.WriteLine("(1234567 * 12)^2 - 15 = \n"); Console.WriteLine("Arithmetic: " + (Math.Pow(1234567 * 12, 2) - 15)); //non-static methods Console.WriteLine("BigFloat w/ non-static: " + bigfloat1.Multiply(12).Pow(2).Subtract(15)); //static methods bigfloat2 = BigFloat.Multiply(bigfloat2, 12); bigfloat2 = BigFloat.Pow(bigfloat2, 2); bigfloat2 = BigFloat.Subtract(bigfloat2, new BigInteger(15)); Console.WriteLine("BigFloat w/ static : " + bigfloat2); //operators Console.WriteLine("BigFloat w/ operators : " + (((bigfloat3 * 12) ^ 2) - 15)); Console.WriteLine(); //additional methods Console.WriteLine("Round(1234567.1234) = " + BigFloat.Round(bigfloat4)); Console.WriteLine("Ceil(1234567.1234) = " + BigFloat.Ceil(bigfloat4)); Console.WriteLine("Floor(1234567.1234) = " + BigFloat.Floor(bigfloat4)); Console.WriteLine("Inverse(1234567.1234) = " + BigFloat.Inverse(bigfloat4).ToString(20)); Console.WriteLine("Sqrt(1234567.1234) = " + BigFloat.Sqrt(bigfloat4)); Console.WriteLine("log10(1234567.1234) = " + BigFloat.Log10(bigfloat4)); //large numbers BigFloat pi = new BigFloat("3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825342117067982148086513282306647093844609550582231725359408128481117450284102701938521105559644622948954930381964428810975665933446128475648233786783165271201909145648566923460348610454326648213393607260249141273724587006606315588174881520920962829254091715364367892590360011330530548820466521384146951941511609433057270365759591953092186117381932611793105118548074462379962749567351885752724891227938183011949"); Console.WriteLine("\nPi to a really long decimal place:"); Console.WriteLine(pi.ToString(200)); Console.WriteLine("\nTau (2*PI): "); Console.WriteLine((pi * 2).ToString(200)); Console.Read(); }
public Dictionary <string, BigFloat> GetClassScores(int i, bool passZeroProbs) { // Github Link: https://github.com/Osinko/BigFloat // This method uses BigFloat library for high precision probability calculations // When multiplication of probability values is performed consecutively, the value gets smaller and smaller List <string> uniqueClasses = trainFeatures[columns.Count - 1].Distinct().ToList();// Gets unique classes string classColumn = columns.Keys.Last(); Dictionary <string, BigFloat> classScores = new Dictionary <string, BigFloat>(); BigFloat numerator; BigFloat denominator = new BigFloat(0); bool denominatorFlag = false; double eps = 0.00001;// if passZeroProbs is selected, use this value as a probability value // CPT's consist of (part1|part2, prob_value) like strings. Each part has (rule$value) like elements. (rule$value) equals to (rule=value) // Example CPT element: (credit_history$all paid|own_telephone$none, class$bad) foreach (string uqClass in uniqueClasses)// Calculates probability values for each class { string queryP1; string part1, part2; // Creates query according to bayes formula; // P(class=x|test_sample)=(P(test_sample|class=x)P(class=x))/P(test_sample) numerator = new BigFloat(1); foreach (string str in columns.Keys) { if (str == classColumn)// P(class=x) part { part1 = String.Format("{0}${1}", str, uqClass); part2 = ""; } else // P(test_sample|class=x) part { // Creates query from test data infos like '(part1|part2_element1,part2_element2)' part1 = String.Format("{0}${1}|", str, testFeatures[columns[str]][i]); part2 = ""; string[] part2Split = bayesNetStructure[str].Split(','); string splitter = ""; for (int j = 0; j < part2Split.Length; j++) { if (part2Split[j] == classColumn) { part2 += String.Format("{0}{1}${2}", splitter, part2Split[j], uqClass); } else { part2 += String.Format("{0}{1}${2}", splitter, part2Split[j], testFeatures[columns[part2Split[j]]][i]); } splitter = ","; } } queryP1 = part1 + part2; double prob = CPT[str][queryP1];// Gets query's probability values from CPT if (prob == 0 && passZeroProbs) { prob = eps; } numerator = numerator.Multiply(new BigFloat(prob)); } if (!denominatorFlag)// P(test_sample) part { denominatorFlag = true; denominator = new BigFloat(0); foreach (string uqInnerClass in uniqueClasses)// Same calculation process with numerator, one difference is this loop calculates each possibilities for classes { BigFloat tempDenominator = new BigFloat(1); foreach (string str in columns.Keys) { if (str == classColumn)// P(class=x) part { part1 = String.Format("{0}${1}", str, uqInnerClass); part2 = ""; } else // P(test_sample|class=x) part { // Creates query from test data infos like '(part1|part2_element1,part2_element2)' part1 = String.Format("{0}${1}|", str, testFeatures[columns[str]][i]); part2 = ""; string[] part2Split = bayesNetStructure[str].Split(','); string splitter = ""; for (int j = 0; j < part2Split.Length; j++) { if (part2Split[j] == classColumn) { part2 += String.Format("{0}{1}${2}", splitter, part2Split[j], uqInnerClass); } else { part2 += String.Format("{0}{1}${2}", splitter, part2Split[j], testFeatures[columns[part2Split[j]]][i]); } splitter = ","; } } queryP1 = part1 + part2; double prob = CPT[str][queryP1];// Gets query's probability values from CPT if (prob == 0 && passZeroProbs) { prob = eps; } tempDenominator = tempDenominator.Multiply(new BigFloat(prob)); } denominator = denominator.Add(tempDenominator); } } if (denominator == 0) { classScores[uqClass] = 0; } else { classScores[uqClass] = numerator.Divide(denominator); } } return(classScores); }
protected override BigFloat Multiply(BigFloat multiplicand, BigFloat multiplier) { return(multiplicand.Multiply(multiplier)); }