El problema que veo es que metaP efectivamente usa las enumeraciones en las variables. El problema es que las enumeraciones se tratan internamente como enteros, lo que impide tratar de obtener un valor de coma flotante. Sin embargo, puede crear su propio formato de punto flotante que crea dos resultados, una parte entera y un exponente. Aún tendrá que procesar esto en un flotador, como Out = Sqrt<42>::mantissa * pow(10,Sqrt<42>::exponent);
. En realidad, la determinación de los valores se deja como un ejercicio para el lector, pero probablemente tendrá que escalar la entrada hacia arriba (con un poder par de 10), calcular la raíz y almacenar el poder/2 que utilizó anteriormente.
Para calcular sqrt < 42>, primero debe establecer el exponente enum a una potencia adecuada, como '-4' (cuanto más bajo, más decimales, pero observe si hay desbordamiento). A continuación, multiplica la entrada por '10^(- 2 * exponente) '. En este caso obtienes 42 * 10^8 = 4200000000. Luego tomas la raíz de este valor obteniendo '64807' como el valor final. En tiempo de ejecución, calcula el "val * 10^exponente" = "64807 * 10^-4" = 64807 * 0.0001 = 6.4807m y lo almacena en un flotador.
El trabajo de conversión excede el propósito, pero puede reducirlo almacenando el exponente como 10^k (es decir, 10^4) y luego haciendo out=sqrt<x>::mantissa/sqrt<x>::exponent
.
edit Acabo de notar que con el método mantissa/exponente, la elección del exponente es arbitraria siempre que sea más grande que la parte entera de la raíz final. Incluso puede ser una constante, lo que facilita el diseño de sus metafunciones. En el caso de 42, por ejemplo, puede seleccionar el 'exponente' para que siempre sea 6000. Luego, multiplica la entrada por 6000^2, toma la raíz entera del producto, luego, en tiempo de ejecución, divide el resultado por 6000 para obtener la raíz . En lugar de tratar la salida como a * 10^b, utiliza la relación sqr (x * b^2) = sqr (x) * b. La matemática desprotege:
- 42 * 6000 * 6000 = 1512000000
- SQR (1512000000) = 38884
- 38884/6000 = 6,4806 (al cuadrado es 41,999)
Busqué en Google "plantilla metaprogramming sqrt" y encontré esto http://www.informit.com/articles/article.aspx?p=30667&seqNum=3 –
Ya lo he visto pero es solo para la parte integral de sqrt de un entero. Me gustaría tener el resultado de coma flotante en tiempo de compilación. – Vincent
Dado que 'sqrt' es una función estándar, usaría' sqrtt' en su lugar. –