Pregunta

Estoy escribiendo un pequeño e inadecuado biblioteca de álgebra lineal en C ++ para un proyecto (lo siento). Estoy poniendo en práctica las matrices y operaciones con números de precisión doble. Que estoy haciendo? Debería implementar una clase de plantilla en su lugar? ¿Hay un tipo más preciso alrededor?

¿Fue útil?

Solución

He escrito una biblioteca C ++ álgebra lineal utilizando plantillas. Mi pensamiento era que lo que se quiere utilizar los números complejos o números de precisión ampliados algún día. Eso fue tal vez hace siete años, y no hemos hecho todavía. casi siempre podemos usar dobles como el tipo de plantilla, y tenemos typedefs para hacer así de fácil.

Un par de veces que hemos ido a la inversa, utilizando tipos menor de una doble. Por ejemplo, hemos utilizado flotador doble en vez de en una aplicación relacionados con la memoria describimos aquí . Sin embargo, el 99,9 por ciento de las veces utilizamos dobles.

Si usted hace uso de un parámetro de plantilla, cuidado con el uso de un tipo entero, pero que requieren implícitamente un tipo de punto flotante. Por ejemplo, supongamos que tiene una matriz cuyas entradas son todos los números enteros y por lo que utilizar una matriz clase. Pero luego se pasa a que un solucionador lineal. Ahora su aritmética se realiza utilizando entero división, y sus resultados son malos. (Lo he hecho!)

Otros consejos

Me implementar la clase / struct usando una plantilla. En el principio, lo más probable es que sea satisfecho con sólo double, pero he encontrado que en cada proyecto en el que no implementar matrices como plantillas, más tarde me arrepentí.

Además, se le da la oportunidad de utilizar más interesante elemento-álgebras -. Aritmética de intervalos, distribuciones de probabilidad, matemáticas complejas, partido de coma fija, submatrices, simple :-) matemáticas, etc.

  

Estoy escribiendo un pequeño e inadecuado   biblioteca de álgebra lineal en C ++ para una   proyecto (lo siento)

OUCH! Tenga cuidado, ten mucho cuidado ... Confirmar JAMA / TNT - Es conseguido el sello de aprobación sobre el mismo NIST y que ya han manejado algunos de los "más simple" álgebra lineal matemáticas por ejemplo, varios algoritmos de factorización. álgebra lineal implica un montón de problemas difíciles con precisión numérica (por ejemplo Hilbert matrices ) y tanto como yo como hacer mi propia cosa que esta es una de esas áreas en las que es posible que desee utilizar una buena base sólida que ha sido ya bien probado.

Usted debe ser capaz de utilizar siempre el doble con él (no del todo seguro de eso), pero los algoritmos de ellos es probablemente más importante que la precisión de las matrices.

Última pregunta respuesta: Sí, existe, se llama long double y es al menos tan precisa como double. Por si se debe utilizar plantillas o no, sí me gustaría usar plantillas. Eso es un gran caso de uso para ellos y creo que va a hacer la portabilidad a algún otro tipo de número escalar más fácil. A continuación, puede también acaba de typedef una matriz flotador doble y / o, dependiendo del sistema que está ejecutando en el que uno y funciona más rápido / mejor allí.

No hacer ningún trabajo extra para usted. Si usted puede llegar a funcionar con doble (o doble largo) ir con eso.

Parece que esto es sólo un pequeño proyecto, en cuyo caso la cosa plantilla se acaba de hacer el trabajo para usted.

Otra opción que no se ha discutido es el uso de una plantilla para definir el tipo de elemento. Que no causa mucho, eventualmente, trabajo extra, pero permite unos cambios más adelante.

No hay otro tipo más preciso que el apoyo a largo doble que también tiene hardware . Sin embargo, usted es libre de hacer sus propios tipos si se siente la necesidad de una mayor precisión. sin embargo, será bastante más lento que el tipo double nativo, incluso con una amplia optimización.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top