0

Всем известно правилльность следующих утверждений:

  • int(1.13) == 1;
  • 1.13 - 1 == 0.13;
  • 0.13 * 100 == 13;

Почему же в программе:

constexpr double d = 1.13;
int t = (d - int(d)) * 100;
cout << t;

выводится 12 ?

AR Hovsepyan
  • 15,934
  • 5
    Заголовок поправьте. Код не ошибочный и ничего не доказывает. Выведите на печать d - int(d). – Эникейщик Oct 14 '19 at 20:45
  • @Эникейщик да, код не ошибочный, заголовок неудачный. Но тогда нужно подсказать какой заголовок лучше подошел бы. – AR Hovsepyan Oct 14 '19 at 20:52
  • ヒミコ почему теряется точность при умножении? – AR Hovsepyan Oct 14 '19 at 20:55
  • @ARHovsepyan, где-то видео было, я его несколько раз смотрел, там про мантиссу очень многое говорилось, и еще сайт есть, но увы... ссылки у меня нет. –  Oct 14 '19 at 20:58
  • 1
    Реально double x = (d - int(d)); printf(%.14e %.17e\n", x, x) печатает 1.30000000000000e-01 1.29999999999999893e-01. Т.о. наблюдаемая "ошибка " это правильный результат (int z = x * 100 даст 12, а не 13). Наблюдаемые при печати double переменной округления происходят именно при форматном выводе – avp Oct 14 '19 at 21:14
  • @Эникейщик, я бы сказал: выведите cout << setprecision(10) << d; – AR Hovsepyan Oct 14 '19 at 21:14
  • 1
    http://coliru.stacked-crooked.com/a/c67812fe369b0911 – HolyBlackCat Oct 14 '19 at 21:39

0 Answers0