import java.util.*;

public class NumericProblems {
  public static void main(String[] args) {
    System.out.println("Calculate e:");
    double evalue = 0.0;
    for (int i = 0; i <= 10; i++) {
      evalue += 1.0/fact(i);
      System.out.println("  e =? " + evalue);
    }
    System.out.println();

    System.out.println("Calculate sqrt(1000):");
    double sqrt1000 = 1000.0;
    for (int i = 0; i <= 10; i++) {
      sqrt1000 = (sqrt1000 + 1000.0/sqrt1000)/2.0;
      evalue += 1/fact(i);
      System.out.println("  sqrt(1000) =? " + sqrt1000);
    }
    System.out.println();

    double x;

    x = 1e15;
    System.out.println("x = " + x + ", x+1 = " + (x+1) + ", x-1 = " + (x-1));
    x = 1e16;
    System.out.println("x = " + x + ", x+1 = " + (x+1) + ", x-1 = " + (x-1));
    System.out.println();

    x = 1e-15;
    System.out.println("x = " + x + ", 1+x = " + (x+1) + ", 1-x = " + (1-x));
    x = 1e-16;
    System.out.println("x = " + x + ", 1+x = " + (x+1) + ", 1-x = " + (1-x));
    System.out.println();

    x = 1e154;
    System.out.println("x = " + x + ", x*x = " + x*x);
    x = 1e155;
    System.out.println("x = " + x + ", x*x = " + x*x);
    System.out.println();

    x = 1e-161;
    System.out.println("x = " + x + ", x*x = " + x*x);
    x = 1e-162;
    System.out.println("x = " + x + ", x*x = " + x*x);
    System.out.println();

    System.out.println("Solving x*x/1000 - 1000x + 1/1000 = 0");
    double a = 0.001;
    double b = -1000.0;
    double c = 0.001;
    x = (-b + Math.sqrt(b*b - 4.0*a*c))/(2.0*a);
    System.out.println("  (-b+sqrt(bb-4ac))/(2a) = " + x);
    x = (-b - Math.sqrt(b*b - 4.0*a*c))/(2.0*a);
    System.out.println("  (-b-sqrt(bb-4ac))/(2a) = " + x);
    x = (2*c)/(-b + Math.sqrt(b*b - 4.0*a*c));
    System.out.println("  (2c)/(-b+sqrt(bb-4ac)) = " + x);    
  }

  public static double fact(int n) {
    double result = 1.0;
    for (int i = 1; i <= n; i++) {
      result *= i;
    }
    return result;
  }
}
