Gestione del comportamento di numeri non finiti

2

Senza usare le classi big int in C ++, qual è un buon modo per gestire l'aritmetica su grandi numeri?

Ad esempio, scrivere una classe Vector che si occupa di prodotti punto e prodotti incrociati usando doppi di grandi dimensioni può portare a valori non finiti. Lascio questo all'utente all'utente per gestire NaN / (- inf per inf), ecc.? Oppure gestisco in qualche modo quei casi usando std :: isfinite nella classe Vector (potenzialmente modificando i valori all'interno dell'istanza della classe)? Mi sento un po 'strano manipolare un oggetto creato dall'utente se uno o più componenti vettoriali risultanti non sono finiti.

L'input è apprezzato.

    
posta David Kramer 13.07.2017 - 03:49
fonte

2 risposte

2

Una classe generica di "Vector" non ha quasi certamente il contesto per gestire tali situazioni e quindi dovrebbe lasciare i dati così come sono. Se per "utente" intendi il programmatore che utilizzerà la classe "Vector", è responsabilità loro occuparsi di tali cose. Se non ti aspetti mai che questi casi si verifichino a causa della natura delle applicazioni che usano questa classe, allora potresti fare in modo che "Vector" segnali un errore, ma io non lo raccomando e non sembra il tuo uso -case comunque. Il massimo che dovresti fare come implementatore della classe "Vector" è cercare di evitare inutilmente di produrre valori non finiti, ad es. (a+b)/2 può essere infinito dove a/2 + b/2 potrebbe non essere. (Ovviamente, potresti anche preoccuparti del underflow.) Tuttavia, potrebbe non valere la complessità e le prestazioni del codice in più per farlo.

Se l'utente finale deve occuparsi di questo dipende da ciò che ti aspetti dall'utente e se un livello intermedio ha il contesto per occuparsene in modo significativo.

    
risposta data 13.07.2017 - 06:10
fonte
1

Seguirò il "principio del minimo stupore".

Se si crea una classe Vector generica e si vuole mantenerla universalmente, IMHO l'approccio più naturale è quello di rendere il proprio comportamento a overflow o underflow coerenti con il comportamento del tipo di base sottostante. Quindi, se non si ottiene un'eccezione per un overflow utilizzando i doppi a 64 bit nel linguaggio di programmazione scelto, e il risultato è solo un NaN, un vettore basato sul doppio dovrebbe mostrare un comportamento simile. Ciò significa che se un componente del vettore diventa NaN, è probabilmente meglio interpretare l'intero vettore come un "valore che non può essere calcolato con più" (o un "NaV"="Non un vettore", analogamente a "NaN"="Not a Number").

Di conseguenza, si dovrebbe fornire una funzione di convenienza nella classe Vector come IsNaV , che controlla se tutti i componenti sono diversi da NaN, per dare all'utente della classe la possibilità di trattare questo caso più facilmente.

    
risposta data 13.07.2017 - 07:56
fonte

Leggi altre domande sui tag