/fp (Specifica il comportamento della virgola mobile)
Aggiornamento: novembre 2007
Specifica il comportamento della virgola mobile in un file del codice sorgente.
/fp:[precise | except[-] | fast | strict ]
Flag
precise
Impostazione predefinita.Migliora l'uniformità dei test a virgola mobile dell'uguaglianza e della disuguaglianza disattivando le ottimizzazioni che potrebbero modificare la precisione delle operazioni in virgola mobile, necessaria per la conformità ai rigidi standard ANSI. Per impostazione predefinita, il compilatore utilizza i registri a 80 bit del coprocessore per conservare i risultati intermedi delle operazioni in virgola mobile. In questo modo la velocità del programma aumenta e la dimensione diminuisce. Tuttavia, poiché queste operazioni interessano tipi di dati a virgola mobile rappresentati in memoria da meno di 80 bit, la presenza di bit aggiuntivi di precisione (80 bit meno il numero di bit in un tipo a virgola mobile più piccolo) in un'operazione complessa può produrre risultati incoerenti.
Specificando /fp:precise su processori x86, le variabili di tipo float verranno arrotondate fino al valore appropriato per assegnazioni, cast e passaggi di parametri a funzioni. L'arrotondamento garantisce che i dati non risultino più significativi della capacità del relativo tipo. Un programma compilato con /fp:precise può essere più lento ed esteso di un programma compilato senza /fp:precise. /fp:precise disattiva gli intrinseci, che vengono sostituiti dalle routine dalla libreria di runtime standard. Per ulteriori informazioni, vedere /Oi (Genera funzioni intrinseche).
Il seguente comportamento della virgola mobile viene attivato con /fp:precise:
Le riduzioni o la sostituzione di più operazioni con una singola operazione composta che presenta un singolo arrotondamento alla fine viene attivata con /fp:precise.
Le ottimizzazioni di espressioni non valide per i valori speciali (NaN, +infinity, -infinity, +0, -0) non verranno consentite. Le ottimizzazioni x-x => 0, x*0 => 0, x-0 => x, x+0 => x e 0-x => -x sono tutte non valide per diversi motivi. Al riguardo, vedere IEEE 754 e lo standard C99.
Il compilatore gestirà correttamente i confronti in cui è coinvolto NaN. Ad esempio, x != x restituisce true se x è NaN e i confronti ordinati in cui è coinvolto NaN generano un'eccezione.
La valutazione di espressioni seguirà C99 FLT_EVAL_METHOD=2, con un'eccezione. Quando si programma per processori x86, poiché la FPU è impostata sulla precisione a 53 bit, verrà considerata la precisione long double.
Anziché eseguire la moltiplicazione per esattamente 1.0, si utilizza ora l'altro fattore: x*y*1.0 diventa x*y, analogamente, x*1.0*y diventa x*y.
Anziché eseguire la divisione per esattamente 1.0, si utilizza ora il dividendo: x*y/1.0 diventa x*y, analogamente, x/1.0*y diventa x*y.
L'utilizzo di /fp:precise con fenv_access ON disattiva alcune ottimizzazioni, ad esempio le valutazioni di espressioni a virgola mobile in fase di compilazione. Se ad esempio si modifica la modalità di arrotondamento con _control87, _controlfp, __control87_2 e viene eseguito un calcolo a virgola mobile, la modalità di arrotondamento specificata non verrà attivata, a meno che fenv_access non sia impostato su ON.
/fp:precise sostituisce l'opzione del compilatore /Op.
fast
Crea il codice più veloce nella maggior parte dei casi. /fp:fast non può essere utilizzata con /fp:strict o /fp:precise, altrimenti verrà utilizzata l'ultima opzione specificata nella riga di comando. /fp:fast e /fp:except genereranno un errore del compilatore.La selezione di /Za, /Ze (Disattiva estensioni linguaggio) (compatibilità ANSI) e /fp:fast potrebbe generare un comportamento imprevisto. È ad esempio possibile che le operazioni a virgola mobile a precisione singola non vengano arrotondate a precisione singola.
except[-]
Modello di eccezioni a virgola mobile affidabile. Le eccezioni si verificheranno non appena generate. Per impostazione predefinita, questa opzione non è attiva. L'aggiunta di un segno meno all'opzione la disattiva in modo esplicito.strict
Si tratta del modello a virgola mobile più rigido. /fp:strict fa sì che fp_contract sia OFF e fenv_access ON. /fp:except è implicita e non può essere disattiva specificando esplicitamente /fp:except-. Se utilizzata con /fp:except-, l'opzione /fp:strict imposta la semantica rigida della virgola mobile, senza considerare eventi di eccezione.
Note
È possibile specificare più opzioni /fp nella stessa compilazione.
Per il controllo del comportamento della virgola mobile tramite funzione, vedere il pragma float_control.
La maggior parte delle ottimizzazioni della virgola mobile correlate a /fp:strict, /fp:except e ai pragma corrispondenti, nonché a fp_contract, dipendono dal computer. /fp:strict e /fp:except non sono compatibili con /clr.
/fp:precise è in grado di soddisfare la maggior parte dei requisiti di un'applicazione relativi al comportamento della virgola mobile. Se necessario, è possibile utilizzare /fp:except e /fp:strict, da cui può tuttavia conseguire una riduzione nelle prestazioni. Per non compromettere le prestazioni, è opportuno utilizzare /fp:fast.
/fp:strict, /fp:fast e /fp:precise sono modalità di precisione (correttezza). Ne può essere attivata una alla volta. Se si specificano /fp:strict e /fp:precise, verrà utilizzata quella elaborata più di recente. Non è possibile specificare sia /fp:strict che /fp:fast.
Per ulteriori informazioni, vedere https://msdn.microsoft.com/library/default.asp?url=/library/en-us/dv_vstechart/html/floapoint.asp.
Per impostare l'opzione del compilatore nell'ambiente di sviluppo di Visual Studio
Aprire la finestra di dialogo Pagine delle proprietà del progetto. Per informazioni dettagliate, vedere Procedura: aprire le pagine delle proprietà dei progetti.
Espandere il nodo Proprietà di configurazione.
Espandere il nodo C/C++.
Selezionare la pagina Generazione codice.
Modificare la proprietà Modello virgola mobile.
Per impostare l'opzione del compilatore a livello di codice
- Vedere la proprietà floatingPointModel.