2013-08-08 12 views

risposta

37

Quando un'operazione genera un NaN silenzioso, non vi è alcuna indicazione che qualcosa sia inusuale finché il programma non verifica il risultato e vede un NaN. Cioè, il calcolo continua senza alcun segnale dall'unità in virgola mobile (FPU) o dalla libreria se il punto mobile è implementato nel software. Un NaN di segnalazione produrrà un segnale, solitamente sotto forma di eccezione dalla FPU. Se l'eccezione è generata dipende dallo stato della FPU.

C++ 11 aggiunge alcune lingue controls over the floating-point environment e fornisce standardized ways to create and test for NaNs. Tuttavia, se i controlli sono implementati non è ben standardizzato e le eccezioni a virgola mobile non vengono in genere catturate nello stesso modo delle eccezioni standard del C++.

Nei sistemi POSIX/Unix, le eccezioni in virgola mobile vengono in genere catturate utilizzando un gestore per SIGFPE.

+20

In aggiunta a questo: In genere, lo scopo di una segnalazione NaN (sNaN) è per il debug. Ad esempio, gli oggetti a virgola mobile potrebbero essere inizializzati su sNaN. Quindi, se il programma non riesce a uno di essi un valore prima di utilizzarlo, si verificherà un'eccezione quando il programma utilizza sNaN in un'operazione aritmetica. Un programma non produrrà uno sNaN inavvertitamente; nessuna operazione normale produce sNaNs. Sono creati esclusivamente allo scopo di avere un NaN di segnalazione, non come il risultato di alcuna aritmetica. –

+8

Al contrario, i NaN sono per una programmazione più normale. Possono essere prodotti da normali operazioni quando non vi è alcun risultato numerico (ad esempio, prendendo la radice quadrata di un numero negativo quando il risultato deve essere reale). Il loro scopo è generalmente quello di consentire all'aritmetica di procedere un po 'normalmente. Ad esempio, potresti avere una vasta gamma di numeri, alcuni dei quali rappresentano casi speciali che non possono essere gestiti normalmente. È possibile chiamare una funzione complicata per elaborare questo array e potrebbe operare sull'array con la normale aritmetica, ignorando i NaN. Al termine, separerai i casi speciali per più lavoro. –

+0

@wrdieter Grazie, quindi la sola differenza maggiore sta generando l'eccezione o no. – JalalJaberi