Pergunta

Eu estou escrevendo uma pequena e inadequada biblioteca de álgebra linear em C ++ para um projeto (me desculpe). Estou implementando as matrizes e operações usando números de precisão dupla. Eu estou fazendo certo? Devo implementar uma classe de modelo em vez disso? Existe um tipo mais preciso ao redor?

Foi útil?

Solução

Eu escrevi um C ++ Álgebra Linear biblioteca usando templates. Meu pensamento era que nós pode querer usar números complexos ou números de precisão estendida algum dia. Essa foi talvez sete anos atrás, e nós não fizemos isso ainda. Nós quase sempre usam duplos como o tipo de modelo, e temos typedefs para fazer tão fácil.

Algumas vezes temos ido para o outro lado, o uso de tipos menor de um duplo. Por exemplo, nós usamos flutuador, em vez do que o dobro em um aplicativo de memória de limite descrito aqui . Mas 99,9 por cento do tempo usamos duplos.

Se você usar um argumento de modelo, observar ao usar um tipo inteiro, mas que exige implicitamente um tipo de ponto flutuante. Por exemplo, digamos que você tem uma matriz cujas entradas são todos inteiros e assim você usa uma matriz classe. Mas então você passar isso para um solucionador linear. Agora sua aritmética é feito usando inteira divisão, e seus resultados estão errados. (Eu fiz isso!)

Outras dicas

Gostaria de implementar a classe / struct usando um modelo. No início, você provavelmente vai estar satisfeito com apenas double, mas eu descobri que em cada projeto onde eu não implementar matrizes como modelos, mais tarde se arrependeu.

Além disso, dá-lhe uma oportunidade de usar mais interessantes elemento-álgebras -. Aritmética intervalar, distribuições de probabilidade, matemática complexa, fósforo de ponto fixo, sub-matrizes, matemática simples :-), etc

Eu estou escrevendo uma pequena e inadequada álgebra linear biblioteca em C ++ para uma projeto (Lamento)

AI! Tenha cuidado, ser muito, muito cuidado ... Confira JAMA / TNT - é tem o NIST selo-de-aprovação sobre ele e já lidou com alguns dos "mais simples" álgebra linear matemática por exemplo, vários algoritmos de factoring. álgebra linear envolve muitas questões difíceis com precisão numérica (por exemplo Hilbert matrizes ) e, tanto quanto eu como fazer minha própria coisa que esta é uma daquelas áreas onde você pode querer usar uma boa base sólida que é já bem testada.

Você deve ser capaz de usar long double com ele (não tenho certeza disso), mas os algoritmos em si são, provavelmente, mais importante do que a precisão das matrizes.

Resposta final pergunta: Sim, existe, ele é chamado long double e é pelo menos tão preciso quanto double. Para se usar modelos ou não, sim eu usaria modelos. Isso é uma grande usecase para eles e eu acho que ele vai fazer a portabilidade para algum outro escalar tipo de número mais fácil. Você pode, então, também só typedef uma bóia e / ou uma matriz dupla, dependendo do sistema que você está em execução no e qual funciona mais rápido / melhor lá.

Não faça qualquer trabalho extra para si mesmo. Se você pode obter com o dobro (ou long double) ir com isso.

Parece que este é apenas um pequeno projeto, caso em que a coisa modelo só vai fazer o trabalho para você.

Outra opção que não foi discutido está usando um modelo para definir o seu tipo de elemento. Isso não causar muito, se algum, o trabalho extra, mas permite algumas mudanças mais tarde.

Não há outro tipo mais preciso do que long double que também tem suporte de hardware . Mas você é livre para fazer seus próprios tipos, se você sentir a necessidade de mais precisão. Eles vão no entanto ser muito mais lento do que o tipo double nativa, mesmo com a otimização extensa.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top