tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
7
ZUGRIFFE
569
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von freizeit-psychologe
    freizeit-psychologe freizeit-psychologe ist offline Mitglied Bronze
    Registriert seit
    Aug 2007
    Beiträge
    34
    Hi,

    ich habe folgendes Problem:

    Mein Prof hat mir die Aufgabe gestellt eine Methode zur Cosinus Funktion zu schreiben, welche die Berechnung abbricht, sobald der Summand nur noch an der 8. Stelle verändert wird.
    Dabei soll ich den Cosinus der Werte (0,-1,1,1000) ausgeben.
    Mit 0,-1 und 1 funktioniert auch alles wunder bar, auch 2 geht, doch bei allem darüber geht nichts mehr und das Programm gibt ab der Ausgabe des letzten funktionierenden Ergenisses nichts mehr aus, auch keine folgenden System.out Ausgaben.

    Kann da einer von euch mal drüberschauen? Ich bin da echt am verzweifeln.


    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    
    public class cosinustest3 {
     
        /**
         * @param args
         */
        public static double EPSILON = 1E-8;
        
        //Fakultät
        public static long Fakultaet(int max) 
        {
            long fakultaet = 1;
     
            for (int x = 1; x <= max; x++) {
                fakultaet = fakultaet * x;
            }
            return fakultaet;
        }
        
        //Cosinusberechnung
        public static float cosinus(float x, int n)
        {
            float result = 0;
            double z = 0;
     
            for (int i = 0; i <= n; i++)
            {
                z = ( (Math.pow(x, (float)2*i))/(float)Fakultaet(2*i)) * Math.pow((float)-1, (float)i);
                result += z;
            } while (Math.abs(z) > EPSILON);
            
            
            return result;
     
        }
     
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            //Ausgabe der Ergebnisse
            // Cosinus nach Berechnung
            System.out.println("Berechnung");
            System.out.println("cos(0) = " + cosinus(0,8));
            System.out.println("cos(1) = " + cosinus(1,8));
            System.out.println("cos(-1) = " + cosinus(-1,8));
            System.out.println("cos(2) = " + cosinus(2,8));
            System.out.println("cos(1000) = funktioniert nicht (System hängt sich auf)" ); // cos(0,-1,1,2) funktionieren, bei allem darüber hängt sich das System auf.
            
            // Vergleich mit den Ergebnissen der in Java eingebauten Cosinus Methode
            // Cosinus Math.cos
            System.out.println("Vergl. mit Math.cos");
            System.out.println("cos(0) = " + Math.cos(0));
            System.out.println("cos(1) = " + Math.cos(1));
            System.out.println("cos(-1) = " + Math.cos(-1));
            System.out.println("cos(2) = " + Math.cos(2));
            System.out.println("cos(1000) = " + Math.cos(1000));
            
        }
     
    }
    Angehängte Dateien Angehängte Dateien
    Geändert von freizeit-psychologe (04.11.11 um 17:02 Uhr)
     
    My personal artcollection on :

    http://kw-3d-art.deviantart.com/

  2. #2
    Avatar von freizeit-psychologe
    freizeit-psychologe freizeit-psychologe ist offline Mitglied Bronze
    Registriert seit
    Aug 2007
    Beiträge
    34
    Sry, hat sich gerade eben erledigt. Habe den Fehler behoben.
     
    My personal artcollection on :

    http://kw-3d-art.deviantart.com/

  3. #3
    Avatar von Fabio Hellmann
    Fabio Hellmann Fabio Hellmann ist gerade online Mitglied Brokat
    Registriert seit
    Aug 2011
    Ort
    München
    Beiträge
    494
    Hey,
    wenn du das Problem gelöst hast, wäre es schön, wenn du deine Lösung noch schreibst und das Thema anschließend als erledigt markierst. Danke

    Gruß

    Fabio
     
    Bitte die Code-Tags verwenden. Bei Java-Code: [java]...[/java]

    Tutorials:
    Automatisches erzeugen eines Inhaltsverzeichnisses (Javascript)
    JAnimationPanel - Animationen für Swing/AWT
    SWTRatingBar (Bewertungs-Composite) selbst programmieren
    ____________________________________________________________________________
    Über eine Bewertung (Stern links unter dem Beitrag) oder ein Danke freue ich mich sehr.

  4. #4
    Evolox Evolox ist offline Grünschnabel
    Registriert seit
    Nov 2011
    Beiträge
    3
    Ich habe genau das gleiche Problem. Ich hoffe mir kann da jemand helfen.

    mfg
    Evolox
     

  5. #5
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.503
    @freizeitpsychologe: Es wäre wirklich nett, wenn du dich noch einmal meldest.
    Ins Blaue hinein geraten: War das Radiant-System dein Problem? Mit %2Pi?

    @Evolox:
    Willkommen bei tutorials.de

    Poste bitte einmal deinen aktuellen Code.
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  6. #6
    Evolox Evolox ist offline Grünschnabel
    Registriert seit
    Nov 2011
    Beiträge
    3
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    
    public class ProgrammCos {
        public static double EPSILON = 1E-8;
     
         
            static long factorial(int max) {
                long fakultaet = 1;
         
                for (int zahl=1; zahl<=max; zahl++) {
                    fakultaet = fakultaet * zahl;
                }
                return fakultaet;
            }
     
        static float cos(float x) {     
            if(x > 3f) {                                    
                System.out.println("Infinity");
                return 0.0f;
            };
            double result = 0.0;
            int n = -1;
            double cos = 0.0;       
            do {
            cos = Math.pow(-1,n+3) * Math.pow(x,2*n+2) / factorial(2*n+2);
            result += cos;
            n += 1;
            } while (Math.abs(cos) >= EPSILON);  //Terminationsbedingung
            return (float) result;
            }
     
     
        public static void main(String[] args) {
            System.out.println("cos(0)=" + cos(0));
            System.out.println("cos(1)=" + cos(1));
            System.out.println("cos(-1)=" + cos(-1));
            System.out.println("cos(1000)=" + cos(1000));  <= hier hängt es 
            System.out.println("Math.cos(0)=" + Math.cos(0));              
            System.out.println("Math.cos(1)=" + Math.cos(1));
            System.out.println("Math.cos(-1)=" + Math.cos(-1));
            System.out.println("Math.cos(1000)=" + Math.cos(1000));
        }
     
    }

    also bis 3 kann der cosinus berechnet werden, aber bei allen zahlen die darüber hinaus gehen hängt sich das programm auf, darum habe ich auch die if bedingung dort eingebracht
    Geändert von sheel (06.11.11 um 09:32 Uhr) Grund: Codetags
     

  7. #7
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.503
    In Zukunft bitte die Codetags (siehe Signatur) verwenden...
    den Effekt siehst du ja.

    Und zum Fehler...
    das Selbe.
    Euch scheint allen nicht bewusst zu sein, dass die Taylor-Formeln
    ihr x im Bogenmaß/Radiant/wie auch immer haben wollen.

    360° sind also 6.28, also zwei mal PI.
    90° wäre entsprechend PI/2 usw.

    Um die Wertwiederholung mit einzubeziehen:
    Statt
    Code cpp:
    1
    2
    3
    4
    
    if(x > 3f) {                                    
        System.out.println("Infinity");
        return 0.0f;
    };
    das:
    Code cpp:
    1
    2
    3
    
    x = x % 6.28318531;
    if(x < 0.0)
        x = 6.28318531 - x;

    Alle float durch double ersetzen ist übrigens in dem Fall kein Nachteil.

    Gruß
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  8. #8
    Evolox Evolox ist offline Grünschnabel
    Registriert seit
    Nov 2011
    Beiträge
    3
    Ahh alles klar, sehr gut jetzt wird mir einiges klarer. Danke. Aber irgendwie klappt es immer noch nicht. Das Programm bleibt immernoch bei Werten über 3 hängen und jetzt auch bei negativen Werten.
     

Ähnliche Themen

  1. DB Reihe zusammenrechnen!
    Von X-Cheats im Forum PHP
    Antworten: 2
    Letzter Beitrag: 19.07.09, 18:18
  2. 3 Bilder in einer Reihe, wie
    Von maeg im Forum PHP
    Antworten: 13
    Letzter Beitrag: 10.06.08, 20:07
  3. Stil wie James Taylor
    Von tobee im Forum Photoshop
    Antworten: 2
    Letzter Beitrag: 17.05.06, 15:19
  4. Bilder pro reihe und Zeile
    Von prims im Forum PHP
    Antworten: 3
    Letzter Beitrag: 15.07.05, 19:29
  5. 3 in reihe
    Von DRXX im Forum PHP
    Antworten: 3
    Letzter Beitrag: 27.12.04, 19:05