phpbar.de logo

Mailinglisten-Archive

[php] Re: aufrunden, abrunden

[php] Re: aufrunden, abrunden

Martin Ramsch m.ramsch_(at)_computer.org
Sun, 15 Aug 1999 03:37:29 +0200


Andreas Braukmann schrieb am Sonntag, den 15. August 1999:
> > Nein, das ist ein kaufmaennischer Rundungsfehler:
> und die soll eben Verfaelschung von gerundeten Datenmengen 
> verhindern.

Die Theorie mit dem absichtlichen "statistischen" Runden würde mir ja
auch als Erklärung gefallen, aber wenn ich mir direkt im Sourcecode
ansehe, wie die Funktion round() programmiert ist, muß ich klar sagen:

  Jein! :-)

PHP-Source functions/math.c:

| /* {{{ proto int round(double number)
|    Returns the rounded value of the number */
| void php3_round(INTERNAL_FUNCTION_PARAMETERS)
| {
|         pval *value;
|         TLS_VARS;
| 
|         if (ARG_COUNT(ht) != 1 || getParameters(ht, 1, &value) == FAILURE) {
|                 WRONG_PARAM_COUNT;
|         }
|         if (value->type == IS_STRING) {
|                 convert_string_to_number(value);
|         }
|         if (value->type == IS_DOUBLE) {
|                 RETURN_DOUBLE(rint(value->value.dval));
                                ^^^^
An dieser Stelle wird bei Fließkommazahlen mit Hilfe der C-Funktion
"rint" gerundet.
|         }
|         if (value->type == IS_LONG) {
|                 RETURN_DOUBLE((double)value->value.lval);
|         }
|         RETURN_FALSE;
| }
| /* }}} */

Und falls "rint" an einem System nicht vorhanden ist, wird es zuvor
optional selbst definiert:

|  #ifndef HAVE_RINT
| /* emulate rint */
| inline double rint(double n)
| {
|         double i, f;
|         f = modf(n, &i);
|         if (f > .5)
|                 i++;
|         else if (f < -.5)
|                 i--;
|         return i;
| }
| #endif

Das ist nicht die vermutete wissenschaftliche Rundung, sondern das
ganz normale Aufrunden ab 0.5 - mit einer Seltsamheit allerdings:
Ich hätte ">= .5" und "<= -.5" geschrieben.
Ob das ein Fehler oder Absicht des Autors ist, weiß ich nicht.

Falls aber die Funktion "rint" eh vorhanden ist (hmm, wo ist das nicht
der Fall?), dann wird gemäß IEEE-754 gerundet, und das geht bei genau
0.5 tatsächlich immer in Richtung der geraden Zahl.

Ciao,
  Martin
-- 
Martin Ramsch <m.ramsch_(at)_computer.org> <URL: http://ramsch.home.pages.de/ >
PGP: 0xE8EF4F75, 52 44 5E F3 B0 B1 38 26  E4 EC 80 58 7B 31 3A D7


php::bar PHP Wiki   -   Listenarchive