Das Problem, das ich sehe ist, dass MetAP effektiv Mißbräuche Aufzählungen in Variablen. Das Problem ist, dass Enums intern als Integer behandelt werden, was den Versuch ausschließt, einen Gleitkommawert aus ihnen zu erhalten. Sie können jedoch möglicherweise Ihr eigenes Gleitkommaformat erstellen, das zwei Ergebnisse, einen ganzzahligen Teil und einen Exponenten erstellt. Sie müssen dies immer noch in einem Float verarbeiten, wie Out = Sqrt<42>::mantissa * pow(10,Sqrt<42>::exponent);
. Eigentlich Bestimmung der Werte für den Leser als Übung, aber Sie werden wahrscheinlich den Eingang skalieren müssen nach oben (durch eine gerade Potenz von 10), die Berechnung der Wurzel, und Speichern der -power/2 Sie früher verwendet.
Um sqrt < 42> zu berechnen, würden Sie zuerst die Exponentenaufzählung auf eine geeignete Potenz wie "-4" setzen (je niedriger, je mehr Dezimalzahlen, aber achten Sie auf Überlauf). Sie multiplizieren dann die Eingabe mit '10^(- 2 * Exponent) '. In diesem Fall erhalten Sie 42 * 10^8 = 4200000000. Sie nehmen dann die Wurzel dieses Wertes und erhalten '64807' als endgültigen Wert. Zur Laufzeit berechnen Sie die "val * 10^Exponent" = "64807 * 10^-4" = 64807 * 0,0001 = 6.4807m und speichern Sie es an einem Schwimmer.
Die zusätzliche Konvertierung funktioniert irgendwie den Zweck, aber Sie können es ein wenig reduzieren, indem Sie den Exponenten als 10^k (dh 10^4) dann tun out=sqrt<x>::mantissa/sqrt<x>::exponent
.
bearbeiten Ich habe gerade festgestellt, dass bei der Mantissen/Exponenten-Methode die Wahl des Exponenten beliebig ist, solange er größer ist als der ganzzahlige Anteil der letzten Wurzel. Es kann sogar eine Konstante sein, die das Design Ihrer Metafunktionen erleichtert. Im Fall von 42 zum Beispiel Sie den ‚Exponenten‘ wählen könnte immer sein 6000. Sie dann die Eingabe mit 6000 multiplizieren^2, nehmen Sie die ganze Zahl Wurzel des Produkts, dann zur Laufzeit, das Ergebnis durch 6000 die Wurzel zu bekommen . Anstatt die Ausgabe als * 10^b zu behandeln, wird die Relation sqr (x * b^2) = sqr (x) * b verwendet. Die Mathematik auscheckt:
- 42 * 6000 * 6000 = 1512000000
- sqr (1512000000) = 38884
- 38884/6000 = 6,4806 (quadriert 41,999)
I „Metaprogrammierung sqrt“ gegoogelt und fand dies http://www.informit.com/articles/article.aspx?p=30667&seqNum=3 –
Ich habe schon gesehen, aber es ist nur für den integralen Teil von sqrt einer ganzen Zahl. Ich möchte das Fließkomma-Ergebnis zur Kompilierzeit haben. – Vincent
Da 'sqrt' eine Standardfunktion ist, würde ich stattdessen' sqrtt' verwenden. –