Domanda

Perché la differenza tra due time_ts restituito da difftime( time_t t1, time_t t2) metodo come a double?Non vedo da dove provenga il requisito di precisione.

È stato utile?

Soluzione

Poiché time_t è semplicemente definito nello standard come arithmetic type capable of representing times.

Questo è tutto ciò che dice a riguardo. Non deve essere un intero, non deve rappresentare secondi. Potrebbe sempre essere un multiplo di dieci o può essere un tipo di punto flottante in grado di rappresentare i tempi fino a una risoluzione di 10 -43 secondi.

La citazione da C99 7.23.1 Components of time è (leggermente parafrasata):

.

I tipi dichiarati sono generatori di generazioneGode e clock_t, che sono tipi aritmetici in grado di rappresentare i tempi. La gamma e la precisione dei tempi rappresentabili in clock_t e time_t sono definiti dall'implementazione.

Da qui le persone che lavorano ciecamente la differenza di tempo con:

delta = time_end - time_begin;
.

può scoprire che il loro codice non funziona su tutte le piattaforme.

Ora non conosco la parte superiore della mia testa nessuna piattaforma dove non è un semplice secondo dall'epoca, ma sono stato morso da ipotesi come prima, ad esempio, come assumere time_t A sono contigui mentre, infatti, non è necessario e non funziona così bene sui prodotti mainframe che utilizzano EBCDIC. E, sì, sono Ancora in pesante Uso nonostante apparentemente dopo aver morire gli anni '60: -)

Il documento C99 Razionale ha questo da dire:

.

I tipi Z e clock_t sono aritmetici perché i valori di questi tipi devono, in conformità con la pratica esistente, in occasione essere confrontati con -1 (un'indicazione "Do not-Know"), adeguatamente cast.

Nessuna proprietà aritmetica di tali tipi sono definite dallo standard, tuttavia, al fine di consentire alle implementazioni la massima flessibilità nella scelta di intervalli, precisioni e rappresentazioni più appropriate alla loro applicazione prevista. La rappresentazione non deve essere un conteggio di alcune unità di base; Un'implementazione potrebbe rappresentare in modo esplicibile componenti diversi di un valore temporale come subfields di un tipo intero.

Altri suggerimenti

Nonostante sia stato universalmente pensato - e implementato - come tipo integrale che rappresenta secondi dall'inizio di qualche epoca, time_t non è in realtà definito formalmente come tale, quindi non è stato possibile utilizzare il risultato del risultato di difftime se fosse atime_t.Per quanto riguarda le altre alternative: int è troppo piccolo in alcune circostanze (come è long) e long long non è portatile.

Probabilmente perché è il tipo aritmetico più generale.E consente una precisione migliore della seconda se il sottostante time_t lo supporta.

Il motivo per questo è che non ci sono operazioni aritmetiche definite per il tipo time_t, restituendo un doppio implica che è possibile utilizzare il risultato in calcoli.

IOW Se si aggiungono due valori time_t l'uno con l'altro in un territorio non sicuro poiché il comportamento diverso potrebbe risultare se Time_T è definito come INT unt firmato o intimo INT - a seconda della piattaforma.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top