Maximum und Minimum in Subroutinen



  • ergy1983 schrieb:

    Wie kann ich denn eine Variable auf minus unendlich setzen?

    Unendlichkeiten gibts es nur bei Gleitkommazahlen, und selbst dort können sie fehlen. Es muss aber auch nur ein Wert sein, der sicher kleiner ist als alle anderen.
    😞



  • Vielen Dank für die super Antworten. Ich ahbe es auch jetzt auch hinbekommen, bis auf ein letztes Problem:

    bei mir wird das Maximum nach Ablaufen der inneren Schleifen immer wieder zurückgesetzt, wenn er auf die äußere Schleife "zurückspringt". Gibt es irgendwie eine Möglichkeit dass er das nicht tut, in allen Ergebnissen nach dem Durchlaufen das Maximum sucht ohne sich zurückzusetzen? (Ich muss eben aber immer die Zwischenergebnisse (phi2) der inneren Schleife vergleichen)

    void cut_view_1(pict*p)
    {
    int x,y;
    double border,ang,teta,phi,phi2,vgl,min,max,pb,teta2;
    /* subroutine for the cutting the field of view for both eyes*/
        for(x=0;x<pict_get_xsize(p)-1;x++) {
            for(y=0;y<pict_get_ysize(p)-1;y++) {
    	    if (pict_get_hangle(p,x,y,p->view.vdir,p->view.vup,&ang)) {
    	        if (DOT(pict_get_cached_dir(p,x,y),p->view.vdir) >= 0.0) {
                        pict_get_vangle(p,x,y,p->view.vdir,p->view.vup,&phi2);
    		    pict_get_sigma(p,x,y,p->view.vdir,p->view.vup,&phi);
    		    pict_get_tau(p,x,y,p->view.vdir,p->view.vup,&teta);
    
    		    vgl=phi2;
    		    phi=phi*180/3.1415927;
                        phi2=phi2*180/3.1415927;
                        teta=teta*180/3.1415927;
    
    		    max=fmax(vgl,phi2);
    		    min=fmin(vgl,phi2);
    		    pb=fmax(vgl,phi2)-fmin(vgl,phi2);
    		    /* Periodenlänge von cos((2*pi/pb)*phi2) */}}
    return;
    }
    

    Ausgabe von Phi2 und max:

    phi2,max,teta2*180/pi=	1,232285	1,232285
    phi2,max,teta2*180/pi=	1,289582	1,289582
    phi2,max,teta2*180/pi=	1,346876	1,346876
    phi2,max,teta2*180/pi=	1,404168	1,404168
    phi2,max,teta2*180/pi=	1,461456	1,461456
    phi2,max,teta2*180/pi=	1,518742	1,518742
    phi2,max,teta2*180/pi=	1,576024	1,576024
    phi2,max,teta2*180/pi=	1,633304	1,633304
    phi2,max,teta2*180/pi=	1,690580	1,690580
    phi2,max,teta2*180/pi=	1,747853	1,747853
    phi2,max,teta2*180/pi=	1,805122	1,805122
    phi2,max,teta2*180/pi=	0,028691	0,028691
    phi2,max,teta2*180/pi=	0,086072	0,086072
    phi2,max,teta2*180/pi=	0,143454	0,143454
    phi2,max,teta2*180/pi=	0,200835	0,200835
    phi2,max,teta2*180/pi=	0,258216	0,258216
    phi2,max,teta2*180/pi=	0,315596	0,315596
    phi2,max,teta2*180/pi=	0,372976	0,372976
    phi2,max,teta2*180/pi=	0,430355	0,430355
    


  • Wahrscheinlich musst du das jedesmal prüfen, nachdem die innere Schleife abgearbeitet ist, bevor die äussere ein weiteres mal anläuft. Wenn mich nicht alles täuscht, müsste der neue Code dann zwischen die beiden } in Zeile 22. Wenn das stimmt, wäre das ein schöner Grund, die } immer in eine eigene Zeile zu schreiben.
    😞



  • Täusche ich mich, oder hast du 'max' und 'min' am Anfang gar nicht mit Werten belegt? Dann wären ihre Werte nämlich zufällig.

    'max' würde ich mit minus unendlich initialisieren, oder mit einer sehr kleinen Zahl, zB -1e100 oder so. 'min' umgekehrt.
    😞



  • µngbd schrieb:

    Täusche ich mich, oder hast du 'max' und 'min' am Anfang gar nicht mit Werten belegt? Dann wären ihre Werte nämlich zufällig.

    'max' würde ich mit minus unendlich initialisieren, oder mit einer sehr kleinen Zahl, zB -1e100 oder so. 'min' umgekehrt.
    😞

    So früh am Tag schon betrunken? 🙄
    Der erste Wert ist min und max gleichzeitig - logisch, oder? 😃



  • pointercrash() schrieb:

    logisch, oder? 😃

    Hmmm. Ja.
    😞



  • Vielen Dank für Eure Antworten. Aber ich muss gestehen. Ich bin nicht weitergekommen. Liegt wohl auhc daran, dass ich das

    Wahrscheinlich musst du das jedesmal prüfen, nachdem die innere Schleife abgearbeitet ist

    nicht richtig verstanden habe...
    Wie kann ich max nach Beginnen der äußeren Schleife sagen, dass er den Wert der vorherigen inneren Schleife behalten soll?

    Hatte auch an return gedacht, aber dann geht nichts mehr oder meinst du, dass ich meine max- Befehle in die äußere Schleife zwischen den beiden {{ setzen soll?

    Vielen Dank nochmal. Stehe wahrscheinlich auf dem Schlauch...



  • ergy1983 schrieb:

    Wie kann ich max nach Beginnen der äußeren Schleife sagen, dass er den Wert der vorherigen inneren Schleife behalten soll?

    Am besten machst du das vor dem Beenden der äusseren Schleife. Freilich müsstest den Code ein wenig konventioneller formatieren, um eine freie Zeile dafür zu finden.

    Disclaimer: ich hab den Code nicht verstanden, sondern nur geraten. Sieht ja auch echt zu grässlich aus, um den Autor ernst zu nehmen.
    🙂



  • Danke. Ich weiß, dass der Code gräßlich aussieht, aber is ja nicht meiner... :p

    Also dann die einfache Variante:

    for(x=0;x<p;x++) {
        for(y=0;y<p;y++) {
            if (x.p.ang)) {
                if (x && y >= 0.0) {	
                    vgl=phi2;
    
                    max=fmax(vgl,phi2);
                    min=fmin(vgl,phi2);
                    pb=fmax(vgl,phi2)-fmin(vgl,phi2);
                    /* Periodenlänge von cos((2*pi/pb)*phi2) */
                }
            }
        }
    }
    


  • ergy1983 schrieb:

    Danke. Ich weiß, dass der Code gräßlich aussieht, aber is ja nicht meiner... :p

    Schon klar, sonst würd ich ja nicht mit dir reden. 🙂
    In der Not einfach man: indent oder AStyle oder sowas verwenden.

    Also: auf pc() hören und das dumme Gerede von den Unendlichkeiten ignorieren. Ich war wohl noch beim Minimax. Sodann: erstmal den Verstand benutzen, und nicht auf mich hören, solange ich Ausflüchte vorbringe, weil ich das Ding nicht verstehen will.

    Dann: über diese Zeilen nachdenken:

    vgl=phi2;
    
                max=fmax(vgl,phi2);
                min=fmin(vgl,phi2);
    

    vg1 wird auf den Wert von phi2 gesetzt. Rat mal, was dann die beiden Extremwerte sind...
    🙂


Anmelden zum Antworten