Portal-Zone Gothic-Zone Gothic II-Zone Gothic 3-Zone Gothic 4-Zone Modifikationen-Zone Download-Zone Foren-Zone RPG-Zone Almanach-Zone Spirit of Gothic

 

Seite 3 von 3 « Erste 123
Ergebnis 41 bis 56 von 56
  1. Beiträge anzeigen #41 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.354
     
    Milky-Way ist offline
    Zitat Zitat von Sektenspinner Beitrag anzeigen
    Deine Beobachtung war dagegen, dass mkf(100/60) etwas ganz großes sei, was aber nicht so sein sollte (und wohl auch nicht so ist, oder?).
    Ich habe es jetzt nochmal mit der damaligen Anwendung ausprobiert und die Zeit verging mit der richtigen Geschwindigkeit (soweit ich das abschätzen kann); damals raste die Zeit nur so, weshalb es "etwas ganz großes" gewesen sein müsste. Wie damals von dir vermutet vermutlich irgendein Fehler, den ich gemacht hatte, da ich den Code anschließend geändert habe, lässt es sich jetzt weder rekonstruieren, noch reproduzieren.

    Zitat Zitat von Sektenspinner Beitrag anzeigen
    Dein Ergebnis von TestFloats ist ebenfalls absolut nachvollziehbar und dokumentationsgetreu. mkf(1/2) soll zum Null-Float auswerten, divf(mkf(1),mkf(2)) zum 0.5-Float.

    Das liegt einfach daran, dass der Term 1/2 zu Null ausgewertet wird und erst dann in mkf eingesetzt wird.

    Alles funktioniert wie es sein soll.
    Ja, so hatte ich es mir auch gedacht. Bis zu meinem PS hatte ich nur deine damalige Aussage falsch verstanden.

    Zitat Zitat von Lehona Beitrag anzeigen
    100/60 ist 1 (Bei der Ganzzahldivision).
    Danke, das war mir ja bekannt.

  2. Beiträge anzeigen #42 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.466
     
    Lehona ist offline
    Wollte nur deine Annahme bestätigen, habe mich etwas knapp ausgedrückt (Kommt davon, wenn man nebenher zum Zocken ins Forum tabbt).

  3. Homepage besuchen Beiträge anzeigen #43 Zitieren
    Adventurer Avatar von orcwarriorPL
    Registriert seit
    Jan 2006
    Ort
    themodders.org
    Beiträge
    79
     
    orcwarriorPL ist offline
    Hi, I maded some simple function based on this package, maybe someone else find them useful.

    Fraction: Nothing special, but you don't have to always do divf(mkf(1),mkf(2)) to have 0.5 etc. :P

    Code:
    // Example: fractionF(9,10) = 0.9 (float)
    func int fractionF(var int d,var int c)
    {
    	d = mkf(d);
    	c = mkf(c);
    	return divf(d,c);	
    };
    Random Float: This one is rather experimental, I tested it couple of times and it looks to be working, but I guess it could be done in some nicer way, but anyway, here's the code:
    It needs fractionf to work properly, but it could be simply changed by editing this line:
    f = fractionf(Hlp_Random(possibilities),possibilities);
    f = divf(mkf(Hlp_Random(possibilities)),mkf(possibilities));

    Code:
    // **************************************************
    // RandF: Function returns random value from
    // [range_start,range)
    // * range should be greater than range_start
    //   but even if not, func should still work properly.
    // * range_start and range have to be a zfloat
    // **************************************************
    func int RandF(var int range_start,var int range)
    {                                                                                                             
    	// -I made only small research, but it looks like bigger numbers generate                                                                                                                
    	//  errors when dividing (floats don't have endless accuracy :-P)                                                                                                                        
    	// When I tried possibilities = 65536, it don't looked like returns 
    	// were proper, numbers bigger than half of range was never returned...                                                                                                                                                           
    	// Unfortunaly this is an random function so I don't have idea 
    	// how to check it, it only possibly to check it theoretically ;-(. 
    	// But as you can see on instance it looks to be working OK.
    	// Unfortunaly low possibilities value, means returned floats                                                                                                                            
    	// could have big step/"jumps", if rDiff>posibilities it means                                                                                                                           
    	// step will be more than 1.0.  
    	
    	const int possibilities = 10000;                                                                                                                                                         
    									
    	var int f; // fe[0,1)
    	var int rDiff; //range difference
    	rDiff = subf(range,range_start);
    
    	f = fractionf(Hlp_Random(possibilities),possibilities);//0.0-0.999..
    	f = mulf(f,rDiff);
    	
    	return addf(range_start,f);	
    };
    Here's a instance of use:
    Spoiler:(zum lesen bitte Text markieren)
    printdebug("RandF(0.0,11.0)");
    printdebug_s_f("1=",RandF(0,mkf(11)));
    printdebug_s_f("2=",RandF(0,mkf(11)));
    printdebug_s_f("3=",RandF(0,mkf(11)));
    printdebug_s_f("4=",RandF(0,mkf(11)));

    printdebug("RandF(1.25,1.5)");
    printdebug_s_f("1=",RandF(fractionf(5,4),fractionf(3,2)));
    printdebug_s_f("2=",RandF(fractionf(5,4),fractionf(3,2)));
    printdebug_s_f("3=",RandF(fractionf(5,4),fractionf(3,2)));
    printdebug_s_f("4=",RandF(fractionf(5,4),fractionf(3,2)));

    printdebug("RandF(-6.0,6.0)");
    printdebug_s_f("1=",RandF(mkf(-6),mkf(6)));
    printdebug_s_f("2=",RandF(mkf(-6),mkf(6)));
    printdebug_s_f("3=",RandF(mkf(-6),mkf(6)));
    printdebug_s_f("4=",RandF(mkf(-6),mkf(6)));

    printdebug("RandF(-60.0,11116.0)");
    printdebug_s_f("1=",RandF(mkf(-60),mkf(11116)));
    printdebug_s_f("2=",RandF(mkf(-60),mkf(11116)));
    printdebug_s_f("3=",RandF(mkf(-60),mkf(11116)));
    printdebug_s_f("4=",RandF(mkf(-60),mkf(11116)));


    zSpy messages appears:
    Spoiler:(zum lesen bitte Text markieren)

    00:28 Info: 5 U: Skript: RandF(0.0,11.0) .... <zError.cpp,#462>
    00:28 Info: 5 U: Skript: 1=8.6679382 .... <zError.cpp,#462>
    00:28 Info: 5 U: Skript: 2=6.7967834 .... <zError.cpp,#462>
    00:28 Info: 5 U: Skript: 3=1.9645614 .... <zError.cpp,#462>
    00:28 Info: 5 U: Skript: 4=4.839859 .... <zError.cpp,#462>
    00:28 Info: 5 U: Skript: RandF(1.25,1.5) .... <zError.cpp,#462>
    00:28 Info: 5 U: Skript: 1=1.2951984 .... <zError.cpp,#462>
    00:28 Info: 5 U: Skript: 2=1.4354934 .... <zError.cpp,#462>
    00:28 Info: 5 U: Skript: 3=1.3868179 .... <zError.cpp,#462>
    00:28 Info: 5 U: Skript: 4=1.407669 .... <zError.cpp,#462>
    00:28 Info: 5 U: Skript: RandF(-6.0,6.0) .... <zError.cpp,#462>
    00:28 Info: 5 U: Skript: 1=-0.5760498 .... <zError.cpp,#462>
    00:28 Info: 5 U: Skript: 2=5.7634277 .... <zError.cpp,#462>
    00:28 Info: 5 U: Skript: 3=1.8273925 .... <zError.cpp,#462>
    00:28 Info: 5 U: Skript: 4=2.8919677 .... <zError.cpp,#462>
    00:28 Info: 5 U: Skript: RandF(-60.0,11116.0) .... <zError.cpp,#462>
    00:28 Info: 5 U: Skript: 1=2580.862 .... <zError.cpp,#462>
    00:28 Info: 5 U: Skript: 2=6168.1777 .... <zError.cpp,#462>
    00:28 Info: 5 U: Skript: 3=7855.7646 .... <zError.cpp,#462>
    00:28 Info: 5 U: Skript: 4=7446.8286 .... <zError.cpp,#462>

    *printdebug_s_f used there simply contact argument 1 (string) and arg 2 (zFloat) and put it in zSpy by normal Printdebug function.

    Greet, orcwarrior.

    EDIT: One mistake(?) I find out in negf function, if you float is zero shouldn't it return 0? I made simple code to check it out:
    Spoiler:(zum lesen bitte Text markieren)
    printdebug_s_f("0neg=",negf(0));
    printdebug_s_i("0neg(int)=",negf(0));
    printdebug_s_f("10+0neg(float)=",addf(mkf(10),negf(0)));
    printdebug_s_i("10+0neg(int)=",addf(mkf(10),negf(0)));

    ZSpy shows:
    Spoiler:(zum lesen bitte Text markieren)
    00:19 Info: 5 U: Skript: 0neg=-0.0 .... <zError.cpp,#462>
    00:19 Info: 5 U: Skript: 0neg(int)=-2147483648 .... <zError.cpp,#462>
    00:19 Info: 5 U: Skript: 10+0neg(float)=8.0 .... <zError.cpp,#462>
    00:19 Info: 5 U: Skript: 10+0neg(int)=1090519040 .... <zError.cpp,#462>

    -0.0 sounds cool but it looks to don't be working appropriate when it comes to math operations with it.

    EDIT2:
    It Could be simply fixed by adding just chage < to <= to function :P
    Spoiler:(zum lesen bitte Text markieren)
    func int negf (var int x) {
    if (x <= 0) { return x & (~MINUS); }
    else { return x | MINUS; };
    };
    Geändert von orcwarriorPL (05.02.2011 um 15:51 Uhr)

  4. Homepage besuchen Beiträge anzeigen #44 Zitieren
    Exodus Avatar von Sektenspinner
    Registriert seit
    Jul 2004
    Ort
    Karlsruhe
    Beiträge
    7.827
     
    Sektenspinner ist offline
    The fraction function is useful. I included it into my current version and it will be included in future releases as fracf. Thanks for the suggestion.

    Your observations on the maximum return value of Hlp_Random may be related to this c++ constant: RAND_MAX
    It seems like it has been 32767 in the Gothic building enviroment.

    Zitat Zitat von orcwarriorPL
    EDIT: One mistake(?) I find out in negf function, if you float is zero shouldn't it return 0? I made simple code to check it out:
    -0.0 is a perfectly valid IEEE 754 float and is supposed to behave differently from +0.0 in several conditions. For example, let eps be a (very) small number and N be a (very) big number, then eps/N will evaluate to -0.0 or +0.0 depending on the sign of eps and N. Simularly 1/-0.0 evaluates to negative infinity instead of positive infinity.
    My script does not implement certain features of IEEE 754, though. The behaviour in overflow and underflow situations (as in the examples above) is currently undefined. Consequently the distinction between -0.0 and +0.0 is useless in my script. I will stick to it anyway.

    I could not reproduce the bug you found. The following code worked fine with the release of september:
    Code:
    func void testfloats() {
        printf(addf(mkf(10),negf(0))); //prints 10.000
        Print(IntToString (addf(mkf(10),negf(0)) == addf(0, mkf(10)))); //prints 1
    };
    If you don't use the version of september this may be the problem.
    Für Spieler:
    Velaya # Velaya in English # Exodus Demo # Irrwichtel
    Tools für Modder:
    DiaDepp # DOPA-PARTER # zSlang
    Scripte für Modder:
    Ikarus Skriptpaket # Floats # Broadcasts

  5. Homepage besuchen Beiträge anzeigen #45 Zitieren
    Adventurer Avatar von orcwarriorPL
    Registriert seit
    Jan 2006
    Ort
    themodders.org
    Beiträge
    79
     
    orcwarriorPL ist offline
    I could not reproduce the bug you found. The following code worked fine with the release of september:
    Yeah, all looks to be ok, the reason was my method of printing: I'm using NicoDE Float32ToString for converting into string first.

  6. Homepage besuchen Beiträge anzeigen #46 Zitieren
    Exodus Avatar von Sektenspinner
    Registriert seit
    Jul 2004
    Ort
    Karlsruhe
    Beiträge
    7.827
     
    Sektenspinner ist offline
    Zitat Zitat von orcwarriorPL Beitrag anzeigen
    Yeah, all looks to be ok, the reason was my method of printing: I'm using NicoDE Float32ToString for converting into string first.
    Nicos function is not the problem.

    addf(mkf(10),negf(0)) evaluated to the word 1090519040 in your test which represents 8.0.
    The same term evaluted to 1092616192 on my setup which represents 10.0.

    But somehow the problem seem to have magically solved itself, since you now get the same results as I do...
    Für Spieler:
    Velaya # Velaya in English # Exodus Demo # Irrwichtel
    Tools für Modder:
    DiaDepp # DOPA-PARTER # zSlang
    Scripte für Modder:
    Ikarus Skriptpaket # Floats # Broadcasts

  7. Beiträge anzeigen #47 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.466
     
    Lehona ist offline

    Fast Squareroot

    Ich habe gemäß diesem Wikipedia-Artikel noch eine performantere Methode der Quadratwurzelberechnung gebastelt, die Ungenauigkeit liegt bei ca. 0.175%...

    Wer also öfter Wurzeln berechnen muss, sollte diese Funktion nehmen. Wurde z.B. auch in Quake III verwendet

    Code:
    func int sqrtf_approx(var int f) {
    	var int x2f;
    	var int threehalfs; 
    	if (!threehalfs) {
    		threehalfs = addf(FLOATEINS, FLOATHALB);
    	};
    	
    	x2f = mulf(f, FLOATHALB);
    	
    	f = 1597463007 /* 5F3759DFh */ - (f >> 1);
    	return invf(mulf(f, subf(threehalfs, mulf(x2f, mulf(f,f)))));
    };
    	
    
    /*	
    float Q_rsqrt( float number )
    {
            long i;
            float x2, y;
            const float threehalfs = 1.5F;
     
            x2 = number * 0.5F;
            y  = number;
            i  = * ( long * ) &y;                       // evil floating point bit level hacking [sic]
            i  = 0x5f3759df - ( i >> 1 );               // what the fuck? [sic]
            y  = * ( float * ) &i;
            y  = y * ( threehalfs - ( x2 * y * y ) );   // 1st iteration
    //    y  = y * ( threehalfs - ( x2 * y * y ) );   // 2nd iteration, this can be removed
     
            return y;
    }
    */
    Der C-Code im Kommentar kommt aus Wikipedia und entstammt Quake III

    Ich muss zugeben dass ich nicht genau weiß, ob diese Art der Wurzelziehung in Daedalus immer noch performanter ist, aber davon ist auszugehen
    Geändert von Lehona (07.04.2011 um 17:58 Uhr)

  8. Homepage besuchen Beiträge anzeigen #48 Zitieren
    Exodus Avatar von Sektenspinner
    Registriert seit
    Jul 2004
    Ort
    Karlsruhe
    Beiträge
    7.827
     
    Sektenspinner ist offline
    Ich habe die Funktion aufgenommen und den Einleitungspost aktualisiert (nun ist auch orcwarriorPLs Vorschlag für eine fracf Funktion enthalten).

    Zitat Zitat von Lehona
    Ich muss zugeben dass ich nicht genau weiß, ob diese Art der Wurzelziehung in Daedalus immer noch performanter ist, aber davon ist auszugehen
    Ohne es getestet zu haben, tippe ich auf einen Faktor von etwa 10.

    Meine Wurzelfunktion braucht 75 Floatingpoint Operationen, deine kommt mit 6 aus.

    Wenn ich wüsste welche Genauigkeitsgarantien meine Variante hat, hätte ich evtl. auch meine Variante einfach durch deine ersetzen können. Aber ohne das genauer untersucht zu haben, wollte ich an der alten lieber nichts ändern (vielleicht ist sie ja die alte deutlich besser und jemand verlässt sich auf genaue Wurzeln).
    Für Spieler:
    Velaya # Velaya in English # Exodus Demo # Irrwichtel
    Tools für Modder:
    DiaDepp # DOPA-PARTER # zSlang
    Scripte für Modder:
    Ikarus Skriptpaket # Floats # Broadcasts

  9. Beiträge anzeigen #49 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.466
     
    Lehona ist offline
    Habe nur mal kurz Google bemüht, aber prinzipiell solltest du einen besseren Startwert als x nehmen... Einfach wäre z.B. den Exponenten zu halbieren (also z.B. exp = ((exp-bias)/2)+bias). Dann kannst du auch die Anzahl der Iterationen verringern und wirst vermutlich sogar noch an Genauigkeit gewinnen. Ansonsten kann ich gleich mal ein bisschen schauen, wie die Genauigkeit so ist.

    Ich habe das alles mal durchgetestet:


    (Wurzel aus | WolframAlpha | Heron-Verfahren (25) | Approx-Verfahren)

    Code:
    7         | 2.64575131 | 2.64530         | 2.649414
    1356845     | 1164.83689 | 1164.812500     | 1165.281250
    1 / 1356845     | 0.00085848 | 0.000858      | 0.000859
    1672345734     | 40894.3239 | 40894.000000     | 40957.000000
    Ich habe es also mit kleinen und großen Werten getestet, ob euch das zu stark abweicht müsst ihr selbst entscheiden. Wenn du übrigens einen besseren Annäherungswert nimmst (Funktion s. unten), komme ich auf die Ergebnisse schon nach 3 Iterationen.



    Code:
    func int sqrtf (var int x) {
        if (x < FLOATNULL) {
            Print ("ERROR: sqrtf: x must be nonnegative.");
    
            return FLOATNULL;
        };
    
        //25 Schritte müssten reichen, wenn nicht bitte erhöhen!
        //Ich habe mir nicht hergeleitet wie schnell die Reihe für verschiedene x konvergiert.
        //für MANCHE x war aber auch schon 15 sehr genau.
        var int y; var int target; target = x; 
        y = ExtractExp(x);
        y = y/2;
        y = packExp(y);
        x = x&~EXP_PATTERN;
        x = x | y;
        
        
        return sqrtf_hlp (target, x, 3) + 0;
    };
    Geändert von Gottfried (08.04.2011 um 18:12 Uhr) Grund: Doppelpost

  10. Homepage besuchen Beiträge anzeigen #50 Zitieren
    Exodus Avatar von Sektenspinner
    Registriert seit
    Jul 2004
    Ort
    Karlsruhe
    Beiträge
    7.827
     
    Sektenspinner ist offline
    Schonmal danke für die Nachforschung soweit.

    Ich werde das wohl genauso übernehmen, wie du vorschlägst. Mein Grafikram hat sich aber gerade wieder verabschiedet weshalb ich Gothic nicht starten kann. Ich schau mir das am Wochenende am andern Rechner nochmal an und mache dann nochmal ne neue Version.

    Edit: Grafik RAM gefönt, Vorschlag getestet, übernommen, Einleitungspost aktualisiert. Danke nochmal!
    Für Spieler:
    Velaya # Velaya in English # Exodus Demo # Irrwichtel
    Tools für Modder:
    DiaDepp # DOPA-PARTER # zSlang
    Scripte für Modder:
    Ikarus Skriptpaket # Floats # Broadcasts
    Geändert von Sektenspinner (08.04.2011 um 22:19 Uhr)

  11. Beiträge anzeigen #51 Zitieren
    Serima Avatar von Fisk2033
    Registriert seit
    Dec 2010
    Ort
    Dresden
    Beiträge
    5.838
     
    Fisk2033 ist offline
    Hi, sry ,aber ich seh irgendwie nicht durch
    Muss ich jetzt eine neue Floats.d anlegen und den Code von oben reinkopieren oder wie importiere ich es jetzt ?

  12. Beiträge anzeigen #52 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.354
     
    Milky-Way ist offline
    Was möchtest du denn überhaupt machen?

  13. Beiträge anzeigen #53 Zitieren
    Serima Avatar von Fisk2033
    Registriert seit
    Dec 2010
    Ort
    Dresden
    Beiträge
    5.838
     
    Fisk2033 ist offline
    LeGo nutzen. In der der Readme von lego steht ja: "Der dort notierte Block muss unter deiner Ikarus.d, sowie deiner |
    | Float.d stehen"

    Und ohne Float kann ich es ja leider nicht nutzen

  14. Beiträge anzeigen #54 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.354
     
    Milky-Way ist offline
    Du musst den Code aus dem ersten Beitrag des Threads kopieren, in einer (z.B. neuen) .d Datei speichern und die Datei in der Gothic.src eintragen. Sie sollte dort oberhalb der LeGo Dateien stehen.

  15. Beiträge anzeigen #55 Zitieren
    Serima Avatar von Fisk2033
    Registriert seit
    Dec 2010
    Ort
    Dresden
    Beiträge
    5.838
     
    Fisk2033 ist offline
    Ah doch wie ich dachte danke, nur um es zu verstehen..Es muss oberhalb stehen damit es eher geparst wird und somit keine fehlermeldung kommt ?

  16. Homepage besuchen Beiträge anzeigen #56 Zitieren
    Exodus Avatar von Sektenspinner
    Registriert seit
    Jul 2004
    Ort
    Karlsruhe
    Beiträge
    7.827
     
    Sektenspinner ist offline
    Zitat Zitat von Fisk2033 Beitrag anzeigen
    Ah doch wie ich dachte danke, nur um es zu verstehen..Es muss oberhalb stehen damit es eher geparst wird und somit keine fehlermeldung kommt ?
    Korrekt.
    Für Spieler:
    Velaya # Velaya in English # Exodus Demo # Irrwichtel
    Tools für Modder:
    DiaDepp # DOPA-PARTER # zSlang
    Scripte für Modder:
    Ikarus Skriptpaket # Floats # Broadcasts

Seite 3 von 3 « Erste 123

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
Impressum | Link Us | intern
World of Gothic © by World of Gothic Team
Gothic, Gothic 2 & Gothic 3 are © by Piranha Bytes & Egmont Interactive & JoWooD Productions AG, all rights reserved worldwide