Unterschied in der Genauigkeit mit Gleitkomma Division vs Multiplikation

8

Gibt es da einen Unterschied:

%Vor%

und das:

%Vor%

Beachten Sie, dass ich in der zweiten Version versuche, die Teilung so spät wie möglich zu verzögern. Erhöht die zweite Version [Delay Divisions] die Genauigkeit im Allgemeinen?

Snippet oben ist nur als Beispiel gedacht, ich versuche nicht, dieses spezielle Snippet zu optimieren.

BTW, ich frage nach der Division im Allgemeinen, nicht nur nach 2 oder einer Potenz von 2, da sie sich auf einfache Verschiebungen in der IEEE 754-Darstellung reduzieren. Ich habe die Division durch 2 geteilt, nur um das Problem anhand eines sehr einfachen Beispiels zu veranschaulichen.

    
Fakrudeen 26.06.2011, 07:18
quelle

4 Antworten

3

Daraus kann nichts gewonnen werden. Sie ändern nur die Skalierung, aber Sie erhalten keine signifikanten Zahlen mehr in Ihrer Berechnung.

Der Wikipedia-Artikel zur Varianz erklärt auf hohem Niveau einige der Möglichkeiten zur Berechnung der Varianz in einer robusten Art und Weise .

    
David Heffernan 26.06.2011, 07:27
quelle
2

Sie gewinnen dadurch keine Genauigkeit, da IEEE754 (was wahrscheinlich ist, was Sie unter dem Deckblatt verwenden) Ihnen die gleiche Präzision (Anzahl der Bits) in welchem ​​Umfang Sie auch arbeiten. Zum Beispiel wird 3,14159 x 10 7 so genau sein wie 3,14159 x 10 10 .

Der einzige mögliche Vorteil (ersterer) besteht darin, dass Sie möglicherweise einen Überlauf beim Einstellen der Abweichungen vermeiden. Aber solange die Werte selbst weniger als die Hälfte des maximal möglichen sind, wird das kein Problem sein.

    
paxdiablo 26.06.2011 07:43
quelle
1

Ich muss David Heffernan zustimmen, es wird Ihnen keine höhere Präzision geben.

Der Grund ist, wie Float-Werte gespeichert werden. Sie haben einige Bits, die die signifikanten Ziffern und einige Bits darstellen, die den Exponenten darstellen (zum Beispiel 3.1714x10-12). Die Bits für die signifikanten Ziffern sind immer gleich, egal wie groß Ihre Nummer ist - was bedeutet, dass das Ergebnis am Ende kein anderes sein wird.

Noch schlimmer - die Verzögerung der Division kann zu einem Überlauf führen, wenn Sie sehr große Zahlen haben.

Wenn Sie wirklich eine höhere Genauigkeit benötigen, gibt es viele Bibliotheken, die große Zahlen oder Zahlen mit höherer Genauigkeit erlauben.

    
Preli 26.06.2011 07:44
quelle
1

Der beste Weg, Ihre Frage zu beantworten, wäre, Tests (sowohl zufällig als auch bereichsbasiert) auszuführen und zu sehen, ob sich die resultierenden Zahlen in der binären Darstellung überhaupt unterscheiden.

Beachten Sie, dass ein Problem, das Sie haben, darin besteht, dass Ihre Funktionen nicht für den Wert > MAX_INT/2 funktionieren, weil Sie den Durchschnitt programmieren.

%Vor%

Dies ist fast sicher kein Problem, es sei denn, Sie schreiben eine Bibliothek auf Sprachenebene. Und wenn die meisten Ihrer Zahlen klein sind, ist das vielleicht egal. In der Tat ist es wahrscheinlich nicht eine Überlegung wert, da der Wert der Varianz MAX_INT übersteigt, da es inhärent eine quadratische Größe ist; Ich würde sagen, dass Sie vielleicht die Standardabweichung verwenden möchten, aber niemand tut das.

Hier mache ich ein paar Experimente in Python (von denen ich glaube, dass sie das IEEE unterstützt, was auch immer es ist, weil es wahrscheinlich Mathematik an C-Bibliotheken delegiert ...):

%Vor%

Kein Problem, ich denke da Division und Multiplikation mit 2 im Binärformat gut darstellbar ist. Versuchen Sie jedoch Multiplikation und Division mit 3:

%Vor%

Macht es wahrscheinlich viel aus? Vielleicht, wenn Sie mit sehr kleinen Zahlen arbeiten (in diesem Fall möchten Sie vielleicht Logarithmus verwenden). Wenn Sie jedoch mit großen Zahlen arbeiten (ungewöhnlich in der Wahrscheinlichkeit) und die Division verzögern, werden Sie, wie ich bereits erwähnt habe, Risikoüberlauf, aber noch schlimmer, Risiko-Bugs aufgrund schwer lesbaren Codes / p>     

ninjagecko 26.06.2011 08:01
quelle