Una classe vettoriale generica consente di raddoppiare i valori non finiti?

4

Attualmente sto scrivendo una classe vettoriale multiuso e immutabile in Java che essenzialmente racchiude un double[] . La classe farà parte di una libreria di giochi, utilizzata per calcolare posizioni di entità, fisica, coordinate pixel, ecc. Il mio obiettivo è renderli utilizzabili anche per altri calcoli (non relativi al gioco).

La classe vector fornisce operazioni di base come ( a e b sono vettori):

  • a.length() (restituisce la lunghezza del vettore nello spazio euclideo)
  • a.add(b) , a.scale(b) (aggiunta o moltiplicazione di tutti i componenti vettoriali)
  • a.dot(b) , a.cross(b) (calcolo del punto e prodotto incrociato di a e b ).

Sto discutendo se dovrei consentire NaN , infinito positivo e negativo come valori vettoriali e se dovrei distinguere tra +0 e -0 . Ci sono dei motivi per cui non consente i doppi -finiti dovrebbero essere consentiti? È persino pratico implementare le operazioni con questi metodi: come ad es. length() e scale(..) si comportano?

Un'altra preoccupazione importante che ho sono i metodi a.hashCode() e a.equals(b) . Questo dovrebbe essere vero:

new Vector(+0D, +0D, +0D).equals(new Vector(-0D, -0D, -0D));

Considerato che

Arrays.equals(new double[] { +0D, +0D, +0D }, new double[] { -0D, -0D, -0D }) == false
    
posta Frithjof 03.11.2015 - 19:29
fonte

2 risposte

2

Seguendo il principio della sorpresa minima, penso che dovresti fare in modo che il tuo vettore si comporti allo stesso modo dei numeri sottostanti. Java è esplicito su come dovrebbe funzionare il floating-point (a differenza di C, ad esempio), facendo riferimento a IEEE 754.

Quindi, sì, permetti valori non finiti (infinito e NaN) e & pm; 0. Colui che usa la tua classe generalmente saprà meglio a che punto gestire i valori speciali - se hanno bisogno di un trattamento speciale - e tu (nella tua classe vettoriale) non puoi fare molto su di loro comunque. Ciò inoltre migliorerà notevolmente le tue prestazioni, perché altrimenti avresti bisogno di innumerevoli condizioni in tutto il luogo e probabilmente ti mancheranno comunque alcuni casi.

Lo stesso ragionamento si applica all'implementazione dell'uguaglianza. Se u e v sono vettori della tua classe, allora u.equals(v) dovrebbe essere true se e solo se u.at(i) == v.at(i) è true per ogni indice valido i .

    
risposta data 27.11.2015 - 04:34
fonte
1

Come gestiresti operazioni aritmetiche che restituirebbero NaN? Le opzioni disponibili sono:

  1. consente di restituire valori non finiti
  2. assicurati che quelle operazioni generino eccezioni, o
  3. lascia che restituiscano null .

Il numero uno mi ricorda il il modello di oggetto nullo e il numero tre di suoni come il sacrilegio se stai cercando di creare codice robusto senza dover cercare null ovunque. Il numero due è possibile, ma la gestione delle eccezioni sembra un disordine. Dipende da te, ma creerai i NaN, non importa cosa.

    
risposta data 27.11.2015 - 03:31
fonte

Leggi altre domande sui tag