größte double die kleiner als x ist



  • @Swordfish Danke, Problem gelöst
    Syntax_error Ich meinte nicht der größte double zwischen -"unendlich" und <=x == x, sonder der größte double zwischen -"unendlich" und < x also der größte double der kleiner als x ist.

    NACHTRAG: Problem doch nicht gelöst, siehe nächster Beitrag.



  • Noch ein kleines Problem:

    std::cout << 32.0-std::numeric_limits< double >::epsilon() << "\n";
    

    gibt 32 aus.
    Auch im Debugger wird
    [/cpp] double t = 32.0-std::numeric_limits< double >::epsilon();
    [cpp]
    als 32 angezeigt.



  • Hört sich stark danach an, als würdest du das falsche Problem lösen. Wozu meinst du denn, das zu brauchen?



  • numeric_limits<double>::epsilon() ist der betragsmäßig kleinste darstellbare Wert, das wird also nur bei betragsmäßig sehr kleinen x funktionieren - meistens wird x + epsilon() == x sein.

    Es gibt aber in C99 eine Funktion nextafter, die genau das kann. Möglicherweise ist sie auf deiner Plattform schon enthalten.

    double x;
    
    double x_plus_eps  = nextafter(x, x + 1); // Nächster double nach x in Richtung x + 1
    double x_minus_eps = nextafter(x, x - 1); // Nächster double nach x in Richtung x - 1
    

    Statt x + 1 oder x - 1 geht natürlich auch alles mögliche andere; wichtig ist nur, ob es größer oder kleiner als x ist.



  • tupolew.eljam schrieb:

    Ich brauche in meinem Jump'n Run Spiel eine Funktion die von einem vorhandenen double x den größten double herausfindet im Bereich von -unendlich bis <x.

    Wozu? Vielleicht gibt's ja noch eine andere Lösung.



  • mit dieser Funktion funktioniert das ganze.


  • Mod

    tupolew.eljam schrieb:

    mit dieser Funktion funktioniert das ganze.

    Ich möchte nochmal auf den Beitrag von Bashar aufmerksam machen. Noch nie hat ein Spieleprogrammierer diese Funktion gebraucht. Du löst höchstwahrscheinlich ein ganz einfaches Problem auf hochkomplizierte Weise. Bitte sag uns, was du erreichen möchtest, nicht wie du denkst, wie du dein Problem lösen kannst.



  • Ein interessantes Problem.

    Mein Vorschlag dazu:

    #include <iostream>
    #include <limits>
    #include <iomanip>
    
    double nextBiggestDouble(double Value) {
    	double loLimit = 1;
    	double hiLimit = 2;
    
    	while(true) {
    		if(loLimit<=Value && Value<hiLimit) {
    			return Value+loLimit*DBL_EPSILON;
    		} else {
    			loLimit*=2;
    			hiLimit*=2;
    		}
    	}
    }
    
    int main() {
    	double Input;
    	do {
    		std::cin>>Input;
    		std::cout<<std::scientific<<std::setprecision(17)<<nextBiggestDouble(Input)<<std::endl;
    	} while(Input!=0.0);
    }
    

    Getestet für Zahlen >=1. Für negative Zahlen müsste man nochmal ran.



  • double nextBiggestDouble(double Value) 
    {
        ++ *(reinterpret_cast<int64_t*>(&Value)); 
        return Value;
    }
    


  • Ich brauche die Funktion daher, da ich eine TileEngine habe, bei der in regelmäßigen Abständen ein Kachel kommt, wenn z.B alle 32 Pixel ein neuer Kachel kommt, dann hat ein Kachel die größe 31.99999999999 Pixel denn bei 32 beginnt schon der nächste Kachel. Also Kachel 0 geht auf der X-Achse beispielsweise von 0-32.9999999999999999999999999999999999. Die Funktion nextafter(x, y) funktioniert. Bei dieser habe ich bis jetzt noch keinen Rundungsfehler bekommen. bei Interesse der Quellcode (nicht immer der aktuellste) lade ich auf https://github.com/tupolew/jump_run hoch.



  • tupolew.eljam schrieb:

    wenn z.B alle 32 Pixel ein neuer Kachel kommt, dann hat ein Kachel die größe 31.99999999999 Pixel

    Nein, die Kachel hat die Grösse 32 Pixel.

    Oder zumindest sehe ich nicht, wo du genau den Wert 31.999... konkret benötigst, selbst wenn du eine spezielle Definition für "Grösse" verwendest. Kannst du das erläutern?



  • Die Kachel hat die Größe 32. Nur er endet immer bei einer x.99999999 Zahl. Da ja bei der nächsten vollen Zahl schon der nächste Kachel beginnt. Kachel 1 beginnt bei 0 und endet bei 31.99999999999999, Kachel 2 beginnt bei 32.0 und Endet bei 63.99999999999999.
    Ich habe halt noch NULL Erfahrung in Spieleprogrammierung, da ich Mittelstufenschüler bin und Programmieren nur als Hobby mache.



  • Warum baust du ein theoretisches Konstrukt, daß du sowieso nicht darstellen kannst? WTF?


  • Mod

    Wieso brauchst du den letzten Wert einer Kachel? Reicht es nicht für alles was man so tun kann, dass 32 der erste Wert ist, der nicht mehr zur Kachel gehört?



  • Ich weiß halt nicht wie ich es anders machen soll, bis jetzt funktioniert alles soweit ganz gut.


  • Mod

    Ach, "es". Dann ist ja klar.



  • RE: Ach, "es". Dann ist ja klar. > Was meinst du?



  • wenn dir das nicht klar ist, wem dann? wir wissen ja nicht, was "es" ist in

    Ich weiß halt nicht wie ich es anders machen soll



  • tupolew.eljam schrieb:

    Die Kachel hat die Größe 32. Nur er endet immer bei einer x.99999999 Zahl. Da ja bei der nächsten vollen Zahl schon der nächste Kachel beginnt. Kachel 1 beginnt bei 0 und endet bei 31.99999999999999, Kachel 2 beginnt bei 32.0 und Endet bei 63.99999999999999.

    Nochmals: Wo genau benötigst du den Wert mit .999... als Nachkommastelle konkret? Wie gedenkst du ihn in den Code einzubauen?


Anmelden zum Antworten