Обновленный ответ после прочтения вашего комментария ниже.
Если вы уже уверены, что значения находятся в пределах [0, 2 ^ 63-1], тогда простое приведение будет быстрее, чем llround()
, поскольку эта функция может также проверять наличие переполнения (в моей системе это указано на странице руководства, однако стандарт C этого не требует).
На моем компьютере, например (Nehalem x86-64) приведение - это одна инструкция (cvttsd2si
), а llround()
, очевидно, больше, чем единица.
Могу ли я получить правильный результат при простом приведении (усечение) или безопаснее округлять ?
Зависит от того, что вы имеете в виду под словом «право». Если значение в double
может быть правильно представлено int64_t
, то вы обязательно получите точно такое же значение. Однако, если значение не может быть точно представлено double
, то усечение автоматически выполняется при приведении. Если вы хотите округлить значение другим способом, это другая история, и вам придется использовать одну из ceil()
, floor()
или round()
.
Если вы также уверены, что никакие значения не будут +/- Infinity или NaN (и в этом случае вы можете использовать -Ofast
), то ваша вторая реализация должна быть самой быстрой, если вы хотите усечение в то время как третий должен быть самым быстрым, если вы хотите floor()
значение.