Clock_gettime nanosecondes calcul

ref: linux clock_gettime

J'ai trouvé une formule qui fonctionne bien pour obtenir le temps de traitement, mais il y a quelque chose que je ne comprends pas.
Voir le résultat ci-dessous.

Les 2 premières lignes, c'est juste pour montrer la forumla dans leurs colonnes respectives.

Je suis le seul à en montrant 3 les résultats d'une course rapide.

La partie intéressante est dans la dernière ligne, pourquoi est - 5551 - 999896062 nanosecondes = 18446744072709661105?

Pourquoi est - 18446744072709661105+1/1E9 = 0.000109?

Je pense qu'il y a certains de conversion de données en cours qui affecte les résultats?

xx:      | t1.tv_sec |   | t1.tv_nsec |          | t2.tv_sec |   | t2.tv_nsec 
xx:      t2-t1(sec)      t2-t1(nsec)         (t2-t1(sec))+(t2-t1(nsec))/1E9

52291:   | 30437 |   | 999649886 |       | 30437 |   | 999759331 
52291:   0   109445          0.000109

52292:   | 30437 |   | 999772970 |       | 30437 |   | 999882416 
52292:   0   109446          0.000109

52293:   | 30437 |   | 999896062 |       | 30438 |   | 5551 
52293:   1   18446744072709661105        0.000109

code source:

int main() {
    struct timespec t1, t2;

    int i = 0;
    while(1) {
        clock_gettime(CLOCK_MONOTONIC, &t1);
            for(int j=0;j<25000;j++) { };
        clock_gettime(CLOCK_MONOTONIC, &t2);
        printf("%d: \t | %llu | \t | %lu | \t\t | %llu | \t | %lu \n", i, (unsigned long long) t1.tv_sec, t1.tv_nsec, (unsigned long long) t2.tv_sec, t2.tv_nsec);
        printf("%d: \t %llu \t %lu \t\t %lf\n", i, (unsigned long long) t2.tv_sec - t1.tv_sec, t2.tv_nsec - t1.tv_nsec, (t2.tv_sec - t1.tv_sec)+(t2.tv_nsec - t1.tv_nsec)/1E9);
        if ((t2.tv_sec - t1.tv_sec) == 1) break;
        i++;
    }
    return 0;
}
Pourquoi ne pas vous convertir le résultat de clock_gettime() 64-bit nombre de nanosecondes? Rend la vie tellement plus facile.

OriginalL'auteur resting | 2012-12-19