On Monday 18 November 2002 20:03, you wrote:
Hi,
On Mon, 18 Nov 2002, Sebastian Huber wrote:
das ist alles andere als Strange.
Leider, ja.
Das ist (unter umstaenden) ein Programmierfehler.
Jein.
Ein Cast ist zwar auch eine Rundung, jedoch nicht immer die gewuenschte. Das sollte immer das gleiche Resulat bringen: rint((max - min) / width) - 1
Nein. Es hat genau die gleichen Probleme wie ein direkter (int) cast.
Soweit ich weiss, fuehrt ein Cast von Gleitkomma zu Ganzzahl dazu, dass der Kommaanteil wegfaellt 4.2 -> 4 und -3.4 -> -3. Bei Werten, die fast eine Ganzzahl sind, ist ein rint, wie du ja auch sagst, auf jeden Fall zu empfehlen.
Aber abhaengig vom rounding mode sind es jeweils verschiedene Werte die "falsch" gerundet werden. "x.5 +- EPS" oder eben "x +- EPS" (x ne ganze Zahl und alles in Dezimalschreibweise).
Tja das laesst sich halt nicht vermeiden, irgendwo ist eine Grenze. Wenn man mit Gleitkommakonstanten arbeitet, muss man daran denken (oder auch nicht, je nach Qualitaetsanspruch).
In _diesem_ Fall wuerde rint tatsache helfen, aber nicht generell (ich gebe zu, das rint() dann besser ist, wenn man ehh schon "fast" Ganzzahlen erwartet, wie eben hier, um solche non-IEEE Rundungen zu minimieren). Das auf x87 nicht mal "-mieee-fp -ffloat-store" helfen, um 49 auszugeben ist allerdings aergerlich, und koennte man als Bug bezeichnen (der naemlich ist, das das divisionsergebnis direkt weiterverwendet (gerundet) wird, anstatt es vorher auf den Stack zu schreiben und neu zu laden). D.h. uebrigens auch, das hierbei das _optimierte_ Programm korrektes IEEE implementiert, die nicht optimierte Variante aber nicht. Dies ist natuerlich nicht generalisierbar, und im allgemeinen hat man mit x87 Hardware verloren, wenn man Performance, und strikte IEEE Konformitaet haben muss (letzteres ist allerdings nur relativ selten wirklich erforderlich, und Leute die es nicht genau wissen, brauchen es ueblicherweise nicht).
Der beste Weg da raus, ist ne moderne x86 Implementierung, die SSE 2 unterstuetzt. Da hat man dann endlich IEEE Konformitaet.
Ciao, Micha.