Ich möchte die nächste Darstellung einer Gleitkommazahl in der Form N/2 ** M in Python finden, wo N und M sind ganze Zahlen. Ich habe versucht, die Minimierungsfunktion von scipy.optimise zu verwenden, aber es kann nicht auf den Fall beschränkt werden, wo N und M Ganzzahlen sind.So beschleunigen Sie die Berechnung, um die nächste Darstellung der Form zu finden N/2 ** M
Ich endete mit einer einfachen Implementierung, die durch Werte von M und N iteriert und findet das Minimum, aber das ist rechenintensiv und zeitaufwendig für Arrays aus vielen Zahlen, was könnte eine bessere Möglichkeit, dies zu tun?
Meine einfache Implementierung ist unten dargestellt:
import numpy as np
def ValueRepresentation(X):
M, Dp = X
return M/(2**Dp)
def Diff(X, value):
return abs(ValueRepresentation(X) - value)
def BestApprox(value):
mindiff = 1000000000
for i in np.arange(0, 1000, 1):
for j in np.arange(0, 60, 1):
diff = Diff([i, j], value)
if diff < mindiff:
mindiff = diff
M = i
Dp = j
return M, Dp
Schleifen über N und M ist wahnsinnig ineffizient. Schleife nur über M (da dies die mit der kleineren Menge möglicher Werte ist), berechne das entsprechende N, lehne es ab, wenn es außerhalb des erlaubten Bereichs für N liegt. – jasonharper
auch, du verwendest numpy, aber wiederholst es immer noch mit einem individuelle Basis, so dass Sie überhaupt nicht von den möglichen Matrix/Matrix-Optimierungen profitieren, die es möglicherweise bietet –
Vielleicht übersehen ich etwas, aber da Sie bereits einen bestimmten Gleitkommawert haben, und da seine binäre Darstellung bereits den Exponenten und speichert Mantisse in Base 2, kannst du diese Werte nicht einfach extrahieren? – brm