Rappresentando la differenza tra time_t
Domanda
Perché la differenza tra due time_t
s restituito da difftime( time_t t1, time_t t2)
metodo come a double
?Non vedo da dove provenga il requisito di precisione.
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
eclock_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.