2016-10-12 1 views
0

Ich habe eine Reihe von Zahlen in (0, 1]der Suche nach guten Skalierungsfaktor für log auf 8,8 Fixpunkt Umwandlung

würde Ich mag den natürlichen Logarithmus dieser Zahlen nehmen, und dann speichern als 8,8 Fixpunkt.

Mein foruma ist K*ln(x) + (1<<16)

aber ich bin nicht sicher, was der beste Wert für K ist.

Mein Denken ist, dass, wenn x verdoppelt, dann ln(x) erhöht sich um ln(2), so dass der Festpunktwert von 1 in festen Punkt erhöhen sollte (dh 256)

Also, würde dies bedeuten, K = 256/ln(2)

dies tut Sinn ergeben?

+1

Wäre das [Q8.8] (https: // en. wikipedia.org/wiki/Fixed-point_arithmetic#Notation) wie in 1 6-Bit-Menge mit 8-Bit-Integer und 8-Bit-Bruchteil? Ist das '(1 << 16)' dazu gedacht, die negativen Zahlen in positive umzuwandeln? Wie Sie wissen, ist "ln (0)" im Wesentlichen eine negative Unendlichkeit. Wenn also die meisten Ihrer Zahlen aus dem Bereich (0, 0.01) stammen, wählen Sie wahrscheinlich eine andere Skala als die meisten aus (0.9, 1 ] Bereich.Haben Sie Informationen über die Verteilung oder ähnliche Informationen, um zu entscheiden, welche Informationen Sie lieber verlieren würden? – MvG

+0

Danke Ja, Q8.8 es ist.Aber ich bin nicht sicher, welche Art von Verteilung der Bereich der Nummern folgt. – Jacko

+0

Einige Beispieleingaben und erwartete Ergebnisse würden zur Klärung beitragen. – chux

Antwort

1

Wie x nähert sich 0, ln (x ) auf negative Unendlichkeit auseinander. Sie versuchen also im Wesentlichen eine unendliche Domäne auf einen endlichen Bereich abzubilden.

Wenn Sie dies auf eine lineare Weise tun, müssen Sie an einem bestimmten Punkt abgeschnitten werden. Wenn Sie den Cut-Off-Wert zu niedrig wählen, verschwenden Sie die Präzision für die von Ihnen repräsentierten Zahlen. Wenn Sie einen Cut-off-Wert erhöhen, werden zu viele Werte an das minimale Element des Bereichs geklammert. Ohne Wissen über die Verteilung des Punktes wird es hier sehr schwer sein, ein passendes Gleichgewicht zu finden.

So könnten Sie vielleicht eine nicht lineare Karte anstelle der linearen, die Sie vorgeschlagen haben, anwenden. So etwas wie die Exponentialfunktion? Was würde bedeuten, dass Sie tatsächlich x anstelle von ln speichern würden (x). Ich würde also sagen, wenn Sie Werte von [0,1) in 16 Bit ohne zu viel Informationsverlust speichern möchten, verwenden Sie einfach Q0.16, d. H. Alle Ziffern im Bruchteil. Für (0,1) können Sie entweder 1 - x speichern oder einen Sonderfall für x = 1 durchführen, so dass Sie das stattdessen als 0 kodieren. Wenn Sie Q8.8-Nummern haben, würden Sie Ihre Zahlen mit multiplizieren 2 = 256 erste, aber wenn Sie Zugriff auf die Bit-Darstellung haben, dass die Multiplikation eine Zeitverschwendung wäre.

ich denke, man hat einen Grund Sie wollen würden Logarithmen speichern, so dass diese Antwort kann nicht sein, was Sie erhofft haben.Ich sehe jedoch keinen einfacheren Weg um das zugrunde liegende Problem, also müssen Sie vielleicht einige Ihrer Ideen überdenken.

Verwandte Themen