2010-04-16 15 views
5

Ho appena letto che C99 ha double_t che dovrebbe essere largo almeno il doppio. Questo implica che fornisca cifre più precise dopo la virgola decimale? Più delle solite 15 cifre per il doppio ?.double_t in C99

In secondo luogo, come usarlo: è soltanto compreso

#include <float.h> 

abbastanza? Ho letto che si deve impostare il FLT_EVAL_METHOD su 2 per il doppio lungo. Come fare questo? Lavorando con metodi numerici, mi piacerebbe la massima precisione senza usare una libreria arbitraria di precisione.

Grazie mille ...

risposta

5

No. double_t è almeno uguale a come doppio; vale a dire, potrebbe essere lo stesso del doppio. Nota 190 nello standard C99 rende chiaro intento:

I tipi float_t e double_t sono destinati ad essere tipi più efficienti del attuazione larghezza almeno pari come float e double, rispettivamente.

Come notato da Michael Burr, non è possibile impostare FLT_EVAL_METHOD.

Se si desidera il tipo a virgola mobile più ampio su qualsiasi sistema disponibile utilizzando solo C99, utilizzare long double. Basta essere consapevoli del fatto che su alcune piattaforme sarà lo stesso di double (e potrebbe anche essere lo stesso di float).

Inoltre, se si "lavora con metodi numerici", si dovrebbe essere consapevoli che per molti (quasi) metodi numerici, l'errore di approssimazione del metodo è molto più grande dell'errore di arrotondamento di doppia precisione, quindi spesso non c'è beneficio per l'utilizzo di tipi più ampi. Esistono delle eccezioni, ovviamente. Su quale tipo di metodi numerici stai lavorando, in particolare?

Edit: seriamente, sia (a) basta usare long double e chiamare un giorno o (b) prendere un paio di settimane per capire come floating-point è effettivamente implementata su piattaforme che si sta targeting, e quali sono i requisiti di precisione effettivi per gli algoritmi che stai implementando.

+0

Grazie. È lungo il doppio più largo di double_t? Questo mi confonde. – yCalleecharan

+0

@yCalleecharan: su alcune piattaforme, sì, su alcune piattaforme, no. Ad esempio, su OSX/Intel, 'double' e' double_t' sono IEEE-754 double, mentre 'long double' è il x86 double extended type, che ha più precisione. Su una piattaforma in cui l'aritmetica in virgola mobile è codegenata all'unità x87 per impostazione predefinita (Windows, forse?), 'Double_t' potrebbe essere uguale a' long double'. È improbabile che 'double_t' sarà * più largo * di' long double' (anche se non impossibile, IIRC). –

+0

Per quanto riguarda i metodi numerici che sto usando, è solo un semplice metodo del 4 ° ordine di Runge Kutta per l'integrazione di un insieme di ODE. Ho dovuto non dimensionare le mie equazioni per ottenere valori "carini" poiché le equazioni sono non lineari e la non linearità può portare a fenomeni di caos. Sto usando strumenti non lineari come un diagramma di biforcazione e una mappa a poincare. Poiché le soluzioni delle ODE sono sensibili, sto cercando di lavorare con la massima precisione possibile. – yCalleecharan

1

Nota che si non si ottiene per impostare FLT_EVAL_METHOD - è impostato dalle intestazioni del compilatore per farvi determinare come la biblioteca fa certe cose con virgola mobile.

Se il codice è molto sensibile all'esatta esecuzione delle operazioni in virgola mobile, è possibile utilizzare il valore di tale macro per compilare in modo condizionale il codice per gestire le differenze che potrebbero essere importanti per l'utente.

Quindi, ad esempio, in generale si sa che double_t sarà almeno uno double in tutti i casi. Se vuoi che il tuo codice faccia qualcosa di diverso se double_t è un long double allora il tuo codice può testare se FLT_EVAL_METHOD == 2 e agire di conseguenza.

Si noti che se FLT_EVAL_METHOD è diverso da 0, 1 o 2, è necessario consultare la documentazione del compilatore per sapere esattamente quale tipo è double_t.

+0

Grazie. Quindi non riesco a impostare questa precisione. Ma posso ancora definire una variabile di tipo double_t includendo semplicemente float.h? – yCalleecharan

+0

Per il tuo secondo commento, puoi per favore fornirmi un breve esempio in modo che comprenda la sua implementazione ... – yCalleecharan

+0

@yCalleecharan: sì, nel qual caso dovresti ottenere "i tipi più efficienti di implementazione almeno altrettanto ampi di ... doppio ". In altre parole, qualcosa forse con più precisione di 'double', ma forse solo un normale' double'. –

0

double_t può essere definito da typedef double double_t; - naturalmente, se si prevede di fare affidamento su specifiche di implementazione, è necessario considerare la propria implementazione.

+0

Grazie per sapere come implementarlo. Ma poi devo includere float.h? – yCalleecharan

Problemi correlati