Question

J'écris une petite bibliothèque insuffisante d'algèbre linéaire en C ++ pour un projet (je suis désolé). Je mise en œuvre des matrices et des opérations à l'aide de numéros doubles de précision. Que je fais? Dois-je mettre en œuvre à la place une classe de modèle? Y at-il un type plus précis autour?

Était-ce utile?

La solution

J'ai écrit une bibliothèque d'algèbre linéaire C ++ en utilisant des modèles. Ma pensée était que nous pourrions utiliser des nombres complexes ou des numéros de précision étendue un jour. C'était peut-être il y a sept ans, et nous n'avons pas encore fait. Nous utilisons presque toujours double comme le type de modèle, et nous avons typedefs à faire facile.

Quelques fois nous sommes allés dans l'autre sens, en utilisant les types petits d'un double. Par exemple, nous avons utilisé plutôt flottant que doubler dans une application liée mémoire décrit ici . Mais 99,9 pour cent du temps, nous utilisons double.

Si vous utilisez un argument de modèle, attention à l'aide d'un type entier, mais exigeant implicitement un type à virgule flottante. Par exemple, supposons que vous avez une matrice dont les entrées sont tous les entiers et ainsi vous utilisez une matrice classe. Mais alors vous repasserez à un solveur linéaire. Maintenant, votre calcul est fait à l'aide entier division, et vos résultats sont mauvais. (Je l'ai fait!)

Autres conseils

J'implémenter la classe / struct en utilisant un modèle. Au début, vous serez très probablement satisfait simplement double, mais j'ai trouvé que dans tous les projets où je ne pas mettre en œuvre des matrices comme modèles, je regrettais plus tard.

En outre, il vous donne l'occasion d'utiliser plus intéressant élément algèbres -. Arithmétique intervalle, les distributions de probabilités, mathématiques complexes, match de point fixe, sous-matrices, :-) mathématique simple, etc

  

J'écris un petit et insuffisant   bibliothèque d'algèbre linéaire en C ++ pour une   projet (je suis désolé)

OUCH! Attention, être très très prudent ... Vérifiez JAMA / TNT - il est a obtenu le timbre de l'approbation du NIST sur elle et ils ont déjà pris en charge une partie des mathématiques d'algèbre linéaire « simple » par exemple divers algorithmes d'affacturage. algèbre linéaire implique beaucoup de questions délicates avec une précision numérique (par exemple Hilbert matrices ) et autant que je comme faire mon propre truc c'est l'un de ces domaines où vous voudrez peut-être utiliser une bonne base solide qui a déjà été bien testé.

Vous devriez être en mesure d'utiliser un long double avec elle (pas tout à fait sûr de cela), mais les algorithmes eux-mêmes sont probablement plus critiques que la précision des matrices.

La réponse finale de la question: Oui, il y a, il est appelé long double et est au moins aussi précis que double. Pour que ce soit d'utiliser des modèles ou non, oui je voudrais utiliser des modèles. C'est un cas d'utilisation pour eux et je pense qu'il fera le portage vers un autre type de nombre scalaire plus facile. Vous pouvez également juste typedef un flotteur et / ou une double matrice, en fonction du système que vous exécutez sur et que l'on travaille plus vite / mieux là-bas.

Ne faites pas de travail supplémentaire pour vous-même. Si vous pouvez obtenir en double (ou long double) aller avec cela.

On dirait que cela est juste un petit projet, auquel cas la chose modèle va juste faire le travail pour vous.

Une autre option qui n'a pas été discuté utilise un modèle pour définir votre type d'élément. Cela ne cause pas beaucoup, le cas échéant, du travail supplémentaire, mais permet des changements plus tard.

Il n'y a pas d'autre type plus précis que long double qui a également un soutien matériel . Mais vous êtes libre de faire vos propres types si vous sentez le besoin de plus de précision. Ils seront toutefois assez lent que le double type natif, même avec l'optimisation extensive.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top