Domanda

Sto scrivendo una piccola e inadeguata biblioteca algebra lineare in C ++ per un progetto (mi dispiace). Sto implementando le matrici e le operazioni utilizzando i numeri di doppia precisione. Sto facendo? Devo implementare una classe template, invece? Esiste un tipo più preciso in giro?

È stato utile?

Soluzione

Ho scritto una libreria C ++ algebra lineare utilizzando i modelli. Il mio pensiero è che si potrebbe desiderare di utilizzare numeri complessi o numeri precisione estesa qualche giorno. Questo è stato forse sette anni fa, e non abbiamo ancora fatto. Usiamo quasi sempre raddoppia come tipo di modello, e dobbiamo typedef per rendere così facile.

Un paio di volte siamo passati dall'altra parte, utilizzano i tipi di piccolo di un doppio. Per esempio, abbiamo utilizzato float, piuttosto che raddoppiare in un'applicazione di memoria-bound descritto qui . Ma il 99,9 per cento del tempo che usiamo doppie.

Se si utilizza un argomento di un template, attenzione per l'utilizzo di un tipo intero, ma implicitamente che richiedono un tipo in virgola mobile. Per esempio, supponiamo di avere una matrice i cui elementi sono tutti i numeri interi e in modo da utilizzare una matrice class. Ma poi si passa che a un risolutore lineare. Ora il vostro aritmetica viene eseguita utilizzando numero intero divisione, ed i risultati sono sbagliate. (Ho già fatto!)

Altri suggerimenti

Vorrei implementare la classe / struct utilizzando un modello. In principio, è molto probabile che essere soddisfatti solo double, ma ho scoperto che in ogni progetto in cui I ha non implementare matrici come modelli, ho poi pentito.

Inoltre, ti dà la possibilità di utilizzare più interessante elemento-algebre -. Intervallo di aritmetica, distribuzioni di probabilità, matematica complessa, match-point fisso, sotto-matrici, la matematica semplice :-), etc

  

Sto scrivendo una piccola e inadeguata   biblioteca algebra lineare in C ++ per un   progetto (mi dispiace)

OUCH! Fate attenzione, essere molto, molto attenti ... Controlla per JAMA / TNT - è ottenuto il NIST timbro-of-approvazione su di esso e che hanno già gestito alcuni dei "più semplice" algebra lineare la matematica ad esempio, vari algoritmi di fattorizzazione. Algebra lineare comporta un sacco di problemi difficili con precisione numerica (ad esempio Hilbert matrici ) e per quanto mi come fare le mie cose questo è uno di quei settori in cui si potrebbe desiderare di utilizzare una buona base solida che è già stato ben collaudato-.

Si dovrebbe essere in grado di utilizzare a lungo raddoppiare con esso (non del tutto sicuro di questo), ma gli algoritmi stessi sono probabilmente più critico che la precisione delle matrici.

Ultima domanda risposta: Sì, c'è, si chiama long double ed è almeno altrettanto preciso come double. Per se utilizzare i modelli o meno, sì, vorrei utilizzare i modelli. Questo è un grande caso d'uso per loro e penso che farà il porting a qualche altro tipo di numero scalare più facile. È quindi possibile anche solo typedef un galleggiante e / o di una doppia matrice, a seconda del sistema in esecuzione su e quale funziona più veloce / meglio lì.

Non fare alcun lavoro supplementare per te stesso. Se si riesce a cavarsela con doppio (o long double) andare con quella.

Sembra che questo è solo un piccolo progetto, nel qual caso la cosa template sarà solo fare il lavoro per te.

Un'altra opzione che non è stato discusso è utilizzando un modello per definire il tipo di elemento. Che non provoca molto, se del caso, lavoro extra, ma permette alcune modifiche in seguito.

Non c'è nessun altro tipo più preciso di lungo doppio che ha anche il supporto hardware . Ma voi siete liberi di fare i propri tipi se si sente la necessità di una maggiore precisione. Saranno tuttavia essere molto più lento di quello del doppio tipo nativo, anche con ampia ottimizzazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top