Потеря точности при преобразовании типов?

Вот такая функция:

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-битных линухах всё ок.


А теперь два вопроса, которые поднимал еще Чернышевский:

Кто виноват?

Что делать?
  • Вопрос задан
  • 3643 просмотра
Решения вопроса 1
@grechnik
Похоже, что кто-то где-то внутри функций, вызываемых из main, вызвал функцию _controlfp (или машинную инструкцию fldcw) и не вернул состояние назад. Как решение, можно вызвать _controlfp(_PC_64, _MCW_PC).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы