| CIT 591 Example Program: Fractions Fall 2002, David Matuszek |
Here is the complete code for the Fractions application. It's
also available as a BlueJ project in this zip
file.
Fractions.java |
/**
* Program to convert a decimal number into a fraction, using
* only a few control structures.
*
* @author David Matuszek
* @version 1.2
*/
public class Fractions {
public static void main(String args[]) {
double decimal;
double originalDecimal;
int LIMIT = 12;
int denominators[] = new int[LIMIT + 1];
int numerator, denominator, temp;
int MAX_GOODNESS = 100;
// Get a number to be converted to a fraction
if (args.length == 1) {
decimal = Double.valueOf(args[0]).doubleValue();
} else {
// No number was given, so just use pi
assert args.length == 0;
decimal = Math.PI;
}
originalDecimal = decimal;
// Display the header information
System.out.println("-------------------------------------------------------");
System.out.println("Program by David Matuszek");
System.out.println("Input decimal number to be converted: " + decimal);
System.out.println();
// Compute all the denominators
System.out.println("All computed denominators:");
int i = 0;
while (i < LIMIT + 1) {
denominators[i] = (int)decimal;
System.out.print(denominators[i] + " ");
decimal = 1.0 / (decimal - denominators[i]);
i = i + 1;
}
System.out.println();
System.out.println();
// Compute the i-th approximation
int last = 0;
while (last < LIMIT) {
// Print out the denominators used in this computation
System.out.print("Using these " + (last + 1) + " denominators: ");
for (int j = 0; j <= last; j++) {
System.out.print(denominators[j] + " ");
}
System.out.println();
// Initialize variables used in computation
numerator = 1;
denominator = 1;
temp = 0;
// Do the computation
int current = last;
while (current >= 0) {
denominator = numerator;
numerator = (numerator * denominators[current]) + temp;
temp = denominator;
current = current - 1;
}
last = last + 1;
// Display results
double value = (double)numerator/denominator;
int goodness = denominators[last];
double error = 100 * Math.abs(value - originalDecimal) / originalDecimal;
System.out.print("fraction = " + (int)numerator + "/" +
(int)denominator);
System.out.print(", value = " + value);
System.out.print(", goodness = " + goodness);
System.out.println(", error = " + (int)error + "%");
System.out.println();
// Exit early if we have reached our goodness criterion
if (Math.abs(goodness) > MAX_GOODNESS) break;
}
}
}
|
Example output |
------------------------------------------------------- Program by David Matuszek Input decimal number to be converted: 3.141592653589793 All computed denominators: 3 7 15 1 292 1 1 1 2 1 3 1 14 Using these 1 denominators: 3 fraction = 3/1, value = 3.0, goodness = 7, error = 4% Using these 2 denominators: 3 7 fraction = 22/7, value = 3.142857142857143, goodness = 15, error = 0% Using these 3 denominators: 3 7 15 fraction = 333/106, value = 3.141509433962264, goodness = 1, error = 0% Using these 4 denominators: 3 7 15 1 fraction = 355/113, value = 3.1415929203539825, goodness = 292, error = 0% |