/* * ============================================================================ * SubtractiveCancellation.java: Simple experiments to demonstrate subtractive * cancellation... * * Test function is f(x) = (1.0 - cos(x))/(x*x) for values of x close to zero. * * Written By: Mark Austin February 2007 * ============================================================================ */ import java.lang.Math; public class SubtractiveCancellation { public static void main ( String [] args ) { System.out.println(""); System.out.println("Part 1. Experiment with: "); System.out.println(" f1(x) = (1-cos(x))/(x*x) "); System.out.println(" f2(x) = (sin(x)^2)/(x*x)(1+cos(x)) "); System.out.println("=================================================="); System.out.println(" dX f1(x) f2(x)"); System.out.println("=================================================="); // Compute and print function values.... double dX = 0.10; System.out.printf("%16.10f %16.8e %16.8e\n", dX, f1(dX), f2(dX) ); dX = 0.01; System.out.printf("%16.10f %16.8e %16.8e\n", dX, f1(dX), f2(dX) ); dX = 0.001; System.out.printf("%16.10f %16.8e %16.8e\n", dX, f1(dX), f2(dX) ); dX = 0.0001; System.out.printf("%16.10f %16.8e %16.8e\n", dX, f1(dX), f2(dX) ); dX = 0.00001; System.out.printf("%16.10f %16.8e %16.8e\n", dX, f1(dX), f2(dX) ); dX = 0.000001; System.out.printf("%16.10f %16.8e %16.8e\n", dX, f1(dX), f2(dX) ); dX = 0.0000001; System.out.printf("%16.10f %16.8e %16.8e\n", dX, f1(dX), f2(dX) ); dX = 0.00000001; System.out.printf("%16.10f %16.8e %16.8e\n", dX, f1(dX), f2(dX) ); dX = 0.000000001; System.out.printf("%16.10f %16.8e %16.8e\n", dX, f1(dX), f2(dX) ); dX = 0.0000000001; System.out.printf("%16.10f %16.8e %16.8e\n", dX, f1(dX), f2(dX) ); System.out.println("=================================================="); System.out.println(""); System.out.println("Part 2. Experiment with: "); System.out.println(" f3(x) = (cosh(x)-cos(x))/(x*x*x) "); System.out.println(" f4(x) = 1/x "); System.out.println("=================================================="); System.out.println(" dX f3(x) f4(x)"); System.out.println("=================================================="); // Compute and print function values.... dX = 0.10; System.out.printf("%16.10f %16.8e %16.8e\n", dX, f3(dX), f4(dX) ); dX = 0.01; System.out.printf("%16.10f %16.8e %16.8e\n", dX, f3(dX), f4(dX) ); dX = 0.001; System.out.printf("%16.10f %16.8e %16.8e\n", dX, f3(dX), f4(dX) ); dX = 0.0001; System.out.printf("%16.10f %16.8e %16.8e\n", dX, f3(dX), f4(dX) ); dX = 0.00001; System.out.printf("%16.10f %16.8e %16.8e\n", dX, f3(dX), f4(dX) ); dX = 0.000001; System.out.printf("%16.10f %16.8e %16.8e\n", dX, f3(dX), f4(dX) ); dX = 0.0000001; System.out.printf("%16.10f %16.8e %16.8e\n", dX, f3(dX), f4(dX) ); dX = 0.00000001; System.out.printf("%16.10f %16.8e %16.8e\n", dX, f3(dX), f4(dX) ); dX = 0.000000001; System.out.printf("%16.10f %16.8e %16.8e\n", dX, f3(dX), f4(dX) ); dX = 0.0000000001; System.out.printf("%16.10f %16.8e %16.8e\n", dX, f3(dX), f4(dX) ); System.out.println("=================================================="); } // Define mathematical functions for Part 1.... public static double f1 ( double dX ) { return (1.0 - Math.cos( dX ))/( dX*dX ); } public static double f2 ( double dX ) { return (Math.sin(dX)*Math.sin(dX))/(dX*dX*(1.0 + Math.cos( dX ))); } // Define mathematical functions for Part 2.... public static double f3 ( double dX ) { return (Math.cosh(dX) - Math.cos( dX ))/( dX*dX*dX ); } public static double f4 ( double dX ) { return (1.0/dX); } }