Я наткнулся на неудачный модульный тест, который включает преобразование чисел типа double в целые числа.
Фактическое число, которое преобразуется, составляет 1,234 * 1000., и в основном код сводится к следующему:
#include
#include
int64_t deltatime(double numSeconds) {
return (int64_t) (numSeconds * 1000.0);
}
int main() {
double s = 1.234;
int64_t ms = deltatime(s);
std::cout (который может быть представлен точно), всегда должен давать мне 1233,9999..., и приведение этого значения к int64_t на самом деле будет 1233 (а не наивно ожидаемым 1234 ).
Но почему-почему я получаю 1234 на x86-64 (без указания каких-либо параметров округления для компилятора)?
Правильно ли просто добавить 0,5 к сумме (перед приведением к int64_t)?
int64_t deltatime(double numSeconds) {
return (int64_t) (numSeconds * 1000.0 + 0.5);
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... ding-error