Was ist die korrekte Alternative zur C99 lrint-Funktion in Windows?
#define lrint(x) (floor(x+(x>0) ? 0.5 : -0.5))
/* und wenn das Verhalten von fesetround(0) benötigt wird */
#define lrint(x) ((int)(x))
ist das korrekt?
Was ist die korrekte Alternative zur C99 lrint-Funktion in Windows?
#define lrint(x) (floor(x+(x>0) ? 0.5 : -0.5))
/* und wenn das Verhalten von fesetround(0) benötigt wird */
#define lrint(x) ((int)(x))
ist das korrekt?
Es gibt keine [einfache] eindeutige Definition von lrint
, die das Verhalten gemäß dem C99-Standard ausführt. Dies liegt daran, dass das Verhalten von lrint
durch separate Aufrufe von fesetround
gesteuert wird. Stattdessen sollten Sie separate Rundungsfunktionen mit garantierten Semantiken für das gewünschte Verhalten Ihrer Anwendung verwenden.
floor(x+(x>0) ? 0.5 : -0.5)
wird nur positive Zahlen korrekt runden, aber nicht negative, da floor() zum negativen Unendlichen rundet, was bedeutet, dass floor(-7.1)=-8 ist, und das zitierte Stück Code behebt das nicht: floor(-7.1-0.5)=-8 immer noch, während das korrekte Runden auf die nächste Ganzzahl -7 ergeben muss. Das folgende Stück Code rundet korrekt:
return int(x + ((x >= 0.0) ? 0.5 : -0.5));
Alternativ,
return ((x >= 0.0) ? floor(x+0.5) : ceil(x-0.5));
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.