У меня есть очень большое значение наносекунды (представляющее наносекунды с эпохи), которое я пытаюсь разбить на секунды, начиная с эпохи и наносекунд:
uint64_t nanosecondsEpoch;
unsigned secs = nanosecondsEpoch / 1000000000ULL;
unsigned nanos = nanosecondsEpoch - (secs * 1000000000ULL);
проблема заключается в том, если я попытаюсь сшить его обратно так:
uint64_t stichBack = secs * 1000000000ULL + nanos
Я получаю что-то, что далеко. Я думаю, что причина в том, что когда я выполняю деление, я получаю 1357314854.03 за секунды, а 0.03 сбрасывается (что приводит к большому расхождению) … но я сбит с толку, потому что такое ощущение, что я должен быть в состоянии сохранить обе части информации в неподписанный и восстановить информацию, не прибегая к поплавкам? Я делаю что-то глупое в арифметике, которое не могу уловить?
Вот конкретный пример:
значение для наносекунд с эпохи somtime сегодня утром: 1357314854032484000
Я бы использовал uint64_t, если бы мог и для секунд, и для наносекунды без знака, но мне интересно, почему я не могу разбить вышеуказанное значение, как указано выше, и собрать его обратно.
поскольку 1e9
меньше чем 2^32-1
(максимальное 32-разрядное целое число без знака), если исходное значение достаточно велико, частное может все еще быть слишком большим, чтобы поместиться в 32-разрядное целое число. Не уверен, каково ваше первоначальное значение, но возможно, вы обрезаете secs
значение в результате.
Других решений пока нет …