/*
 * aufgabe34.java
 *
 * Created on 13. Januar 2001
 */

/**
 *
 * Matthias Mayer
 * Fragen und Verbesserungen an : 
 * matthias.mayer@student.uni-magdeburg.de	 
 */
 
 public class aufgabe34{

/*Jeder Algorithmus bekommt seine eigene Methode*/

    static double A1(double n)
    {
        return Math.log(n)/Math.log(2);
    }
    static double A2(double n)
    {
        return (n*Math.log(n))/Math.log(2);
    }
    static double A3(double n)
    {
        return n*n;
    }
    static double A4(double n)
    {
        return n*n*n;
    }
    static double A5(double n)
    {
        return Math.pow(2,n);
    }

/* Methode die die Ergebnisse in eine anständige Form bringt
   Das geht sicher auch einfacher, habe aber keine passende Methode
   gefunden die das erledigt was diese Methode erledigt
   Die Methode gibt jede erdenkliche Zahl die hier bei den
   Berechnungen in Frage kommt in der Form 2.0 E 2 aus
   die Zahl hinter dem E ist der Exponent zur Basis 10 der Zahl vorne,
   also wär das hier die 200*/

    static String ausgabe (double e)
    {
        String aus;
        if (e==0) return "0 s\t";
        else
        {

        /* damit auch negative Zahlen Zahlen umgewandelt werden
           wird jede Zahl zum anfang erstmal 2 mal mit
           100000000 multipliziert */

            e=e*100000000;
            e=e*100000000;

          /* Jetzt sehen alle Zahlen etwa so aus 2.20550852050E9,
             Java schreibt bei ganz großen Zahlen zum Ende E mit
             dem Exponent zur Basis 10 dran
             Da das für eine Tabelle nicht so geeignet ist,
             und der Exponent um 16 zu groß ist muss etwas passieren */

            //Zahl wird in Typ String umgewandelt und in s gespeichert
            String s=String.valueOf(e);

            //Länge des Strings
            int l=s.length();

            //Position von E wird bestimmt
            int pose=s.indexOf("E");

            //leeres String Potenz wird angelegt
            String potenz ="";

            /*die Potenz wird aus dem String entnohmen
              in dem String potenz gespeichert */
            potenz=s.substring(pose+1,l);

            int p;
            //Potenz wird in Integer Wert umgewandelt
            p=Integer.parseInt(potenz);

            //die 16 Nullen werden wieder nun von der Potenz abgezogen
            p=p-16;

            //Nun brauchen wir noch die ersten beiden Zahlen der Zahl
            String anfang ="";
            anfang=s.substring(0,3);

            /*Jetzt haben wir alles was wir brauchen, noch nett
            verpacken und zurück*/
            aus=anfang+" E "+p+" s";
        }
        return aus;
    }


    /* Das Hauptpramme ist denke ich mal selbsterklärend
       nur soviel /t setzt einen Tabulator das macht sich für
       die Tabelle ganz gut*/

    public static void main (String args[]){

        final double r1=0.001;
        final double r2=0.000000001;

        System.out.println("Algorithmus A1:\t\teffi.Hardw.\tDifferenz");
        System.out.println();
        for (int k=0; k<=10; k++){
            double e1=(A1(Math.pow(2,k))*r1);
            double e2=(A1(Math.pow(2,k))*r2);
            System.out.print("k="+k+"\t"+ausgabe(e1));
            System.out.print("\t"+ausgabe(e2));
            double d=(e1-e2);
            System.out.println("\t"+ausgabe(d));
        }
        System.out.println();
        System.out.println("Algorithmus A2\t\teffi.Hardw.\tDifferenz");
        System.out.println();
        for (int k=0; k<=10; k++){
            double e1=(A2(Math.pow(2,k))*r1);
            double e2=(A2(Math.pow(2,k))*r2);
            System.out.print("k="+k+"\t"+ausgabe(e1));
            System.out.print("\t"+ausgabe(e2));
            double d=(e1-e2);
            System.out.println("\t"+ausgabe(d));
        }
        System.out.println();
        System.out.println("Algorithmus A3\t\teffi.Hardw.\tDifferenz");
        System.out.println();
        for (int k=0; k<=10; k++){
            double e1=(A3(Math.pow(2,k))*r1);
            double e2=(A3(Math.pow(2,k))*r2);
            System.out.print("k="+k+"\t"+ausgabe(e1));
            System.out.print("\t"+ausgabe(e2));
            double d=(e1-e2);
            System.out.println("\t"+ausgabe(d));
        }
        System.out.println();
        System.out.println("Algorithmus A4\t\teffi.Hardw.\tDifferenz");
        System.out.println();
        for (int k=0; k<=10; k++){
            double e1=(A4(Math.pow(2,k))*r1);
            double e2=(A4(Math.pow(2,k))*r2);
            System.out.print("k="+k+"\t"+ausgabe(e1));
            System.out.print("\t"+ausgabe(e2));
            double d=(e1-e2);
            System.out.println("\t"+ausgabe(d));
        }

        System.out.println();
        System.out.println("Algorithmus A5\t\teffi.Hardw.\tDifferenz");
        System.out.println();
        for (int k=0; k<=10; k++){
            double e1=(A5(Math.pow(2,k))*r1);
            double e2=(A5(Math.pow(2,k))*r2);

            /* Hier musste ich dann die unendlichen Werte abfangen
               den meine Methode Ausgabe kommt mit denen überhaupt
               nicht zurecht, also unendlich in dem Sinn das des den
               zugelassen Wertebereich für double-Werte übertrifft*/

            if (e1>1.7E308)
                System.out.print("k="+k+"\t"+e1+"\t");
            else
                System.out.print("k="+k+"\t"+ausgabe(e1)+"\t");
            if (e2>1.7E308)
                System.out.print(e2+"\t");
            else
                System.out.print(ausgabe(e2)+"\t");
            if (e1>1.7E308)
                System.out.print(e1);
            else{
                double d=(e1-e2);
                System.out.println(ausgabe(d));}
        }
}
}

/* Bemerkung : Falls eure IDE keine Tabulatoren unterstützt könnte
   in der Ausgabe ein ziehmlicher Mist zustande kommen , bei mir unter
   JBuilder sieht das für Algorithmus A1 so aus

Algorithmus A1:		effi.Hardw.	Differenz

k=0	0 s		0 s		0 s
k=1	1.0 E -3 s	1.0 E -9 s	9.9 E -4 s
k=2	2.0 E -3 s	2.0 E -9 s	1.9 E -3 s
k=3	3.0 E -3 s	3.0 E -9 s	2.9 E -3 s
k=4	4.0 E -3 s	4.0 E -9 s	3.9 E -3 s
k=5	5.0 E -3 s	5.0 E -9 s	4.9 E -3 s
k=6	6.0 E -3 s	6.0 E -9 s	5.9 E -3 s
k=7	7.0 E -3 s	7.0 E -9 s	6.9 E -3 s
k=8	8.0 E -3 s	8.0 E -9 s	7.9 E -3 s
k=9	9.0 E -3 s	9.0 E -9 s	8.9 E -3 s
k=10	1.0 E -2 s	1.0 E -8 s	9.9 E -3 s

unter Forte 4 Java siehst nicht ganz so hübsch aus man kann
aber eine Tabelle erkennen*/
