2 Stimmen

C++ Windows Alternative zu lrint?

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?

3voto

Sam Harwell Punkte 94511

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.

0voto

Serge Rogatch Punkte 12301
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.com

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.

Powered by:

X