schnell rauskriegen, ob double-wert gerade/ungerade ist



  • angenommen, wir haben eine double-zahl x, von der wir wissen, dass sie eine ganze zahl ist (z.b. 0.0, 1.0, 4.0, 8.0 oder 19.0). kennt ihr einen trick, wie man rauskriegen kann, ob diese zahl gerade oder ungerade ist, ohne dass man die zahl zunächst nach int casten muss?
    irgendwelche bit-spielereien?



  • ohne cast? weiss ich nicht, könnte aber sein dass es geht. ansonsten: ungerade = (int)x&1;
    🙂



  • if(zahl%2==0) {
    cout<<"Gerade. ;D";
    }

    Du testest damit einfach, ob bei der Division durch zwei ein rest ensetht oder eben nicht.



  • schau dir halt das format an wie solche zahlen binär dargestellt werden, dann kannst du schauen welches bit 1 sein muss, damit es ungerade ist.



  • So vielleicht:

    gerade=x*0.5-floor(x*0.5)<0.000001;
    

    Aber wenn es nicht ums Prinzip geht, erscheint mir das Casten sinnvoller.

    auauauou schrieb:

    schau dir halt das format an wie solche zahlen binär dargestellt werden, dann kannst du schauen welches bit 1 sein muss, damit es ungerade ist.

    Gibt es bei floats und doubles überhaupt ein Bit, dass direkt oder indirekt angibt, ob die Zahl gerade oder ungerade ist? Für Negativität gibt es das wohl. Aber so genau kenn ich die interne Darstellung nicht, mag also sein.

    makkurona schrieb:

    if(zahl%2==0) {
    cout<<"Gerade. ;D";
    }

    Du testest damit einfach, ob bei der Division durch zwei ein rest ensetht oder eben nicht.

    Wobei das aber nur mit Ganzzahlen (also int & Co.) geht.



  • oder so:

    int double_is_odd (double d)
    {
      d += 6755399441055744.0;
      return *(int*)&d & 1;
    }
    

    die funktion spuckt 'ne 1 aus, wenn der input ungerade ist.
    der pointer-cast ist nur dazu da, damit das & funktioniert und im maschinencode nicht mehr vorhanden. es ist kein aufwendiger double-to-int cast.
    🙂


Anmelden zum Antworten