gaußklammer



  • hallo
    wie geht die formel für die Gaußklammer?
    ich habe mich bei google schon zu tode gesucht. finde aber nur die Anwendung aber nicht die eigentlich formel.



  • Wo liegt genau das Problem?
    Die Gaussklammer rundet doch nur auf die naechskleinere ganze Zahl ab.



  • XFame schrieb:

    Wo liegt genau das Problem?
    Die Gaussklammer rundet doch nur auf die naechskleinere ganze Zahl ab.

    Wie genau?
    Wenn ich runde_auf_die_naechstkleinere_ganze_zahl(1.23) meinem Kompiler sage so antwortet er mir dass er nicht weiß wie das geht.

    PS. Und nein ich will nicht ein float nach int casten oder die Funktion floor() (falls so etwas in C gibt) aufrufen. Ich will sozusagen meine eigene floor() Funktion.



  • Mit Hilfe des Modulo Operators sollte das nicht allzu kompliziert sein. %1 und dann abziehen. Und positiv und negativ unterscheiden.



  • Hi,
    das ist schon mal ein guter Ansatz. Danke.

    Das Problem bei der Modulo-Division ist aber, wie du selbst sagst, dass man zw. positiv und negativ unterscheiden muss...
    Wobei es ist eigentlich kein Problem sondern zusätzlicher Aufwand.

    Ich habe mal in der Schule einen anderen gelernt, ohne Modulodivision, also nur mit + - * / (bzw nur bestimmte davon) und ohne Fallunterscheidungen.
    Leider kenne ich ihn nicht mehr und finde im internet auch nichts dazu.



  • matimatiker schrieb:

    Ich habe mal in der Schule einen anderen gelernt, ohne Modulodivision, also nur mit + - * / (bzw nur bestimmte davon) und ohne Fallunterscheidungen.

    Keine Vergleiche oder so, nur Basisrechenoperationen? Die nehmen doch alle die Nachkommastellen mit (oder sind sinnlos, so wie Divisionen duch sich selbst etc.).



  • float floor( float var ) {
     float dir = ( (var < 0) ? -1 : 1 );
     float nat = 0;
     var *= dir;
     while( nat + 1 < var ) ++nat;
     return( nat * dir );
    }
    

    sollte geben:
    5.5 -> 5
    -1.5 -> 1

    hab ich aber nicht getestet und ist auch alles andere als performant, aber was besseres fällt mir gerad nicht ein



  • Geht besser: Obergrenze bestimmen durch verdoppeln, dann bin mit binärer Suche suchen. Kostet halt log(n) Operationen, aber schnell geht's nicht, wenn man nix außer +-*/ und Vergleichen benutzen möchte.



  • Jester schrieb:

    aber schnell geht's nicht, wenn man nix außer +-*/ und Vergleichen benutzen möchte.

    Mir gings nicht so sehr darum, dass man den Algorithmus auf bestimmte Operatoren beschränkt. Ich habe nur irgendwelche waagen Erinnerungen an die Schule wo wir irgendeine Funktion hatten, die nur aus + - * / bestand. Vielleicht hatte sie auch Exponenten oder auch Betragstriche. Aber auf jeden Fall keine Iterationen und Modulo-Division, weil wir das nicht mal in der Oberstufe behandelt haben.

    Ich nehme auf jeden Fall die Modulo-Division.

    Und danke an euch alle.





  • Wieso castet du nicht einfach nach int ?



  • matimatiker schrieb:

    Jester schrieb:

    aber schnell geht's nicht, wenn man nix außer +-*/ und Vergleichen benutzen möchte.

    Mir gings nicht so sehr darum, dass man den Algorithmus auf bestimmte Operatoren beschränkt. Ich habe nur irgendwelche waagen Erinnerungen an die Schule wo wir irgendeine Funktion hatten, die nur aus + - * / bestand.

    Damit kann man nur rationale Funktionen darstellen. Die Gaussklammer ist aber keine.

    Vielleicht hatte sie auch Exponenten oder auch Betragstriche.

    Schon besser, reicht aber auch nicht.

    Aber auf jeden Fall keine Iterationen und Modulo-Division, weil wir das nicht mal in der Oberstufe behandelt haben.

    Dann frag mal in der Grundschule rum, die können das noch, Division mit Rest 🤡

    Du willst hier aber eigentlich keine normale Modulo-Operation, da die nur für ganze Zahlen definiert ist, sondern das, was in C fmod heißt. Dumm nur, dass diese Funktion auch nicht einfacher ist als die Gaussklammer. Man würde eher fmod über die Gaussklammer definieren als andersrum.

    Die Bibliotheksfunktion floor dürfte die Zahl erstmal mithilfe von Bitoperationen zerlegen. Nachkommastellen abschneiden, ggf. 1 abziehen.


  • Mod

    Leute, guckt mal auf die Uhr, von wann der Thread ist!


Anmelden zum Antworten