static void ShowResults(FrequencyArray freq, string heading, string xlabel) { Console.WriteLine("\n{0}\n", heading); Console.WriteLine("Max {0}: {1}", xlabel, freq.Value(freq.Length - 1)); Stats stats = new Stats(); stats.Calc(freq); Console.WriteLine("Sample size: {0}", stats.Size()); Console.WriteLine("Average: {0}", stats.Average().ToStringMixed()); Console.WriteLine("Median: {0}", stats.Median()); Console.WriteLine("Mode: {0}", stats.Mode()); Console.WriteLine("Standard Deviation: {0}", stats.StandardDeviation().ToStringMixed()); display_graph(freq, xlabel, "Frequency"); }
static void display_graph(FrequencyArray freq_data, string xlabel, string ylabel) { // Determine scale for graph int i; double scale = (double)teminal_cols / (double)freq_data.MaxFreq; Console.WriteLine("\n{0}| {1}", xlabel, ylabel); Console.WriteLine(new String('-', teminal_cols + 6)); for (i = 0; i < freq_data.Length; i++) { string bar = new String('#', (int)Math.Round(freq_data.Frequency(i) * scale)); Console.WriteLine("{0}|{1} {2}", freq_data.Value(i), bar, freq_data.Frequency(i)); } Console.WriteLine(); }
static void SingleTest(int denominator) { FrequencyArray time_freq = new FrequencyArray(); FrequencyArray loop_freq = new FrequencyArray(); DoTest(denominator, time_freq, loop_freq); time_freq.Sort(); loop_freq.Sort(); ShowResults(time_freq, "Time taken to convert floating point to faction (time is in 10s of nanoseconds)", "Time"); #if CALCULATE_LOOP_STATISTICS ShowResults(loop_freq, "Iterations taken to convert floating point to faction", "Loops"); #else Console.WriteLine("\nStatistics for loop count not gathered. To enable loop statistics,\n"); Console.WriteLine("recompile defining \"CALCULATE_LOOP_STATISTICS\"\n"); #endif }
static void RandomTest(int minTests) { Random rnd = new Random(); ArrayList denominators = new ArrayList(); int nTests = 0; while (nTests < minTests) { int denominator = rnd.Next(minTests, 214748364) % minTests; // Make sure it's a unique denominator bool found = false; foreach (int dem in denominators) { if (dem == denominator) { found = true; break; } } if (!found) { denominators.Add(denominator); nTests += denominator - 1; } } FrequencyArray time_freq = new FrequencyArray(); FrequencyArray loop_freq = new FrequencyArray(); foreach (int denominator in denominators) { DoTest(denominator, time_freq, loop_freq); } time_freq.Sort(); loop_freq.Sort(); ShowResults(time_freq, "Time taken to convert floating point to faction (time is in 10s of nanoseconds)", "Time"); #if CALCULATE_LOOP_STATISTICS ShowResults(loop_freq, "Iterations taken to convert floating point to faction", "Loops"); #else Console.WriteLine("\nStatistics for loop count not gathered. To enable loop statistics,\n"); Console.WriteLine("recompile defining \"CALCULATE_LOOP_STATISTICS\"\n"); #endif }
static long tnanosecPerTick = (1000L * 1000L * 100L) / Stopwatch.Frequency; // 10s of nanosecond conversion factor static void DoTest(int denominator, FrequencyArray time_freq, FrequencyArray loop_freq) { Stopwatch stopWatch; // = Stopwatch.StartNew(); Fraction f = new Fraction(0.0); int i; for (i = 0; i < denominator; i++) { stopWatch = Stopwatch.StartNew(); f.Set(((double)i) / ((double)denominator)); stopWatch.Stop(); // According to Microsoft docs, when using Stopwatch, the first execution should be ignored if (i > 0) { time_freq.Increment((int)(stopWatch.Elapsed.Ticks * tnanosecPerTick)); #if CALCULATE_LOOP_STATISTICS loop_freq.Increment(Fraction.nLoops); #endif } } }
public void Calc(FrequencyArray freq_data) { // Average _size = 0; int i, sum = 0, max_freq = 0; for (i = 0; i < freq_data.Length; i++) { _size += freq_data.Frequency(i); sum += i * freq_data.Frequency(i); if (freq_data.Frequency(i) > max_freq) { max_freq = freq_data.Frequency(i); _mode = i; } } _average = (double)sum / (double)_size; // median and variance double var = 0; int count = 0; _median = -1; for (i = 0; i < freq_data.Length; i++) { var += (i - _average) * (i - _average) * freq_data.Frequency(i); count += freq_data.Frequency(i); if (_median == -1 && count >= _size / 2) { _median = i; } } // standard deviation _standard_deviation = Math.Sqrt(var / (double)(_size - 1)); }