J'essaie d'améliorer un SWRTC en modifiant la définition d'un second (long unsigned n_ticks_per_second) en synchronisant l'heure avec un serveur.Conversion à float dans uint32_t calcul
#include <stdint.h>
#include <stdio.h>
int main(int argc, char * argv[]){
int32_t total_drift_SEC;
int32_t drift_per_sec_TICK;
uint32_t at_update_posix_time = 1491265740;
uint32_t posix_time = 1491265680;
uint32_t last_update_posix_time = 1491251330;
long unsigned n_ticks_per_sec = 1000;
total_drift_SEC = (posix_time - at_update_posix_time);
drift_per_sec_TICK = ((float) total_drift_SEC)/(at_update_posix_time - last_update_posix_time);
n_ticks_per_sec += drift_per_sec_TICK;
printf("Total drift sec %d\r\n", total_drift_SEC);
printf("Drift per sec in ticks %d\r\n", drift_per_sec_TICK);
printf("n_ticks_per_second %lu\r\n", n_ticks_per_sec);
return 0;
}
Ce que je ne comprends pas est que je dois jeter total_drift_SEC à flotteur afin d'avoir un résultat correct à la fin, -à-dire d'avoir n_ticks_per_sec égal à 1000 à la fin.
La sortie de ce code est:
dérive total sec -60
Drift par seconde dans les tiques 0
n_ticks_per_second 1000
considérant que la sortie du code sans la fonte pour flotter est:
dérive totale sec -60
Drift par seconde dans les tiques 298054
n_ticks_per_second 299054
Alternative: 'rift_per_sec_TICK = (1LL * total_drift_SEC)/(at_update_posix_time - last_update_posix_time);' – chux
@chux: Ou ... '(int64_t) total_drift_SEC ...' simplement quelque chose signé avec un rang plus élevé alors 'uint32_t'. – alk
@alk Je préfère '1LL *' ou similaire par rapport à casting comme '1LL *' ne rétrécit pas 'total_drift_SEC', quel que soit le type, mais le casting peut se rétrécir dans une version ultérieure du code quand' total_drift_SEC' est un type comme 'double' . – chux