Suche Daseinsberechtigung für "Prä-Summen-Sortierung" bei floats



  • Hallo, ich habe letztens mitbekommen, dass man bei float Summen zuerst von klein nach groß sortieren sollte, um Ungenauigkeiten zu minimieren. Diesbezüglich fiel auch das Stichwort: http://en.wikipedia.org/wiki/Kahan_summation_algorithm

    Mit den Zahlen der Wiki Seite kommt aber das richtige Ergebnis raus:

    float fa[3] = { 10000.0f, 3.14159f, 2.71828f };
    float summe = 0;
    for each(float f in fa) summe += f;
    cout << summe << endl;
    

    Gibts diese Problematik nicht mehr? Ist mein Beispiel fehlerhaft? Kennt jemand ein minimalistisches Beispiel, welches die Problematik veranschaulicht?

    Tschau

    P.S. Ich möchte mich schonmal im Voraus für diese möglicherweise idiotische Frage entschuldigen 😉



  • Kahan summierung sortiert ja nicht. Aber ja, es ist sinnvoll, wenn du Zahlen mit sehr großen exponenten und Zahlen mit sehr kleinen exponenten hast. Insbesodnere mit Vorzeichenwechseln. Auch wirds relevant wenn du permanent sehr viele kleine zahlen aufsummierst. irgendwann werden die Rundungsfehler groß (trat bei uns auf als wir eine Normalisierungskonstante einer exponentialverteilung mit 2^16 summanden berechnet haben)

    Alternativ natürlich bei Zahlentypen mit sehr kleiner Mantisse (16Bit floats oder so).

    Dass das Wikipediabeispiel bei dir funktioneirt war klar, weil du nirgendwo die Mantisse voll ausnutzt. mach mal aus dem ersten Summand 10^20 oder so und vergleich dann mit double.


Anmelden zum Antworten