Stefan Reuther <
stefa...@arcor.de> schrieb:
Wenn's geht...
nerbyint() rundet halt nach dem gegenwärtigen "rounding direction".
Die kann man natürlich mit fesetround() setzen, wenn man es genau
haben will. Ist kein so besonders tolles Design.
Oder man nimmt round(), das rundet immer von Null weg, wenn man
"round ties to even" haben will, kann man roundeven() nehmen
(hm, könnte neu in C23 sein, den habe ich gerade offen).
Und wenn ich ein bisschen lästern darf: Der Abschnitt 4 in Clause
7.6 von n3054 (aka C23) ist ein bisschen arg Prinzip Hoffnung:
Certain programming conventions support the intended model of use
for the dynamic floating-point environment:
- a function call does not alter its caller’s floating-point
control modes, clear its caller’s floating- point status flags,
nor depend on the state of its caller’s floating-point status
flags unless the function is so documented;
— a function call is assumed to require default floating-point
control modes, unless its documen- tation promises otherwise;
— a function call is assumed to have the potential for raising
floating-point exceptions, unless its documentation promises
otherwise.
Fortran macht das in der Sprache klar, da muss der Compiler dafür
sorgen, dass die Rundung am Ausgang der procedure wieder geändert
wird. Hat nur den manchmal überraschenden Nebeneffekt, dass das
Setzen von Rundungsmoden in einem Unterprogramm ein no-op ist :-)