Вот такая функция:
void fp()
{
int64_t tmpn=(((1<<30)-1)/3*2)*1000LL;
double tmpd=tmpn/1000.0;
int64_t tmpm=(int64_t)(tmpd*1000.0);
printf("%lld %.3f %lld\n", tmpn, tmpd, tmpm);
fflush(stdout);
}
Вызываю ее в начале и в конце функции main(). Выхлоп отличается. В начале:
715827882000 715827882.000 715827882000
В конце:
715827882000 715827904.000 715827904512
Если внимательно посмотреть на число 715827904.000, можно увидеть, что в мантиссе осталось 24 бита, остальные — нули. Т.е. как будто целое число преобразовывали не в double, а во float.
Проявляется это только на винде, в 32-битной mingw. В 64-битных линухах всё ок.
А теперь два вопроса, которые поднимал еще Чернышевский:
Кто виноват?
Что делать?