Dumme Idee oder nicht?

Heute musste ich mich mit einer Klasse beschäftigen, von der ich Objekte über den Konstruktor Mathedingsi(double a, double b) erstellen kann, so dass Zahlen aus einem offenen Intervall ]a,b[ akzeptiert sowie verarbeitet und alle anderen außerhalb des Intervalls abgelehnt werden.

Nun bräuchte ich das ganze Verhalten jedoch für abgeschlossene Intervalle [a,b]. Da wir ja aber nur mit Gleitkommazahlen hantieren und diese endlich viele und diskret sind, ist jede Menge offen und abgeschlossen und es ist [a,b]=]prev(a),next(b)[ ]a,b[=[prev(a),next(b)], wenn prev(a) die a vorausgehende Gleitkommazahl und next(b) die b nachfolgende Gleitkommazahl bezüglich der normalen Ordnung “<” ist.

Ist es wirklich eine gute Idee, sich solche Methoden next und prev zu schreiben? Irgendwie sieht mir das nach einem arg üblen Hack aus. Nichtsdestotrotz habe ich sie implementiert – so ganz trivial ist das übrigens gar nicht – und alles funktioniert so. Einfacher als die ursprüngliche Klasse abzuändern war’s in jedem Fall.

Naja, es ist kein Code an einer wichtigen Stelle oder den ich nochmal verwenden werde – daher lasse ich es mal so…

Tags: ,

4 Antworten zu “Dumme Idee oder nicht?”

  1. felix sagt:
    Mozilla Firefox 2.0.0.14 Mac OS

    du meinst wohl eher ]a,b[ = [next(a), prev(b)], oder? oder halt [a,b] = ]prev(a), next(b)[. :)
    mich wuerde eher interessieren wie du prev und next implementiert hast. dies portabel hinzubekommen ist gar nicht so einfach, wenn die verwendete laufzeitbibliothek so etwas nicht anbietet. (es sei denn natuerlich man arbeitet mit java, wo die fliesskommazahlen immer gleich aussehen, egal ob der rechner mit dem format nativ arbeiten kann oder nicht…)
    ich persoenlich wuerde zumindest lieber die klasse abaendern bzw. eine neue machen. ist irgendwie sauberer. allerdings, gleitkommazahlen per se sind alles andere als sauber, also was soll’s…

  2. Kornel sagt:
    Mozilla Firefox 3.0b5 Linux

    Jaja, natürlich [a,b] = ]prev(a), next(b)[. (Beitrag ist von 23:21 Uhr und ich hatte nicht so viel Schlaf die letzten Tage. Später im Bett habe ich sogar noch gedacht, dass ich das bestimmt vertauscht hab’. War aber zu faul aufzustehen und hatte mich schon auf einen Kommentar von Dir oder jemand anderen eingestellt. ;-) )

    Und ja, es handelt sich nur um Java-Doubles und nicht um C oder so. Mit doubleToLongBits(double)
    und dem dort angegebenen Code zum bestimmen von Mantisse, Exponent und Vorzeichen

     int s = ((bits >> 63) == 0) ? 1 : -1;
     int e = (int)((bits >> 52) & 0x7ffL);
     long m = (e == 0) ?
                     (bits & 0xfffffffffffffL) < < 1 :
                     (bits & 0xfffffffffffffL) | 0x10000000000000L;

    und ein paar Fallunterscheidungen sowie der Rückumwandlung mit longBitsToDouble(long) geht das ganz gut.

    Wäre es Code an einer wichtigeren Stelle würde ich es anders lösen. Finde die Idee aber irgendwie schön - wenn auch im Sinne von schön häßlich. ;-)

  3. Til sagt:
    Mozilla Firefox 3.0 Linux

    Ich finde die Idee eine nächste Fließkommazahl zu bestimmen mathematisch eigenwillig* — und sehr cool.

    * Ich kenne die Matisse/Exponent/Genauigkeit-Problematik, obwohl ich nie Numerik zu ende gehört habe (war aber auch morgens um 8!!!)

  4. Kornel sagt:
    Mozilla Firefox 3.0.1 Linux

    … obwohl ich nie Numerik zu ende gehört habe …

    Naja, ich weiß auch nicht, ob ich aus der Numerikvorlesung was mitgenommen habe… man wusste ja auch nie, ob man die vorgestellten Sätze glauben sollte (da die Herleitungen höchst lückenhaft waren, musste man glauben – oder halt zweifeln).

    Wie er auch auf Nachfrage offensichtlich falsche Sachen verteidigte … “exp(-1/2) ist negativ! Sie studieren Mathematik! Malen sie sich das mal hin, wenn sie das nicht sofort sehen!” – “Ja, die Summe zweier nicht-singulärer Matrizen ist wieder nicht-singulär.” und so oft fehlten Voraussetzungen (so waren in den wenigen allgemeinen Sätzen z.B. Normen immer von Skalarprodukten induzierte Normen, ohne dass das je irgendwo angemerkt wurde).

    Naja, ich hatte 50 von 100 Punkten in der Klausur und man brauchte 50 – da hab ich mir noch ein “Sie brauchen sich gar nicht so zu freuen – das ist keine Glanzleistung!” abgeholt und damit das Thema abgehakt. (Für Aufgaben, die man richtig aber anders als er gelöst hatte, gab es 3 von 10 Punkten – genauso wie kommentarlos für die Aufgabe, zu der ich geschrieben hatte “Diese Aufgabe lässt sich nicht lösen … Gegenbeispiel: … Ich beweise folgende leicht abgeänderte Version der Aufgabe: …” – wer die Aufgabe mit unpräziser Argumentation “bewiesen” hatte, wurde von ihm mit 10 Punkten belohnt.

    Tja, du hast also nicht sonderlich viel verpasst – außer dem Frühaufstehen.

Eine Antwort hinterlassen