Дмитрий Радищев (dibr) wrote,
Дмитрий Радищев
dibr

2х2

Оказывается, станочек может пропускать шаги например потому, что 2×2 не всегда равно 4. Точнее даже, 2×2 не всегда равно 2×2. А ещё точнее - (int)((double)A+(double)B*(double)0.0) может отличаться от другого такого же (int)((double)A+(double)B*(double)0.0) аж на целую на единицу (при неизменных A и B, естественно). Что характерно, ошибкой это не является, и вполне допустимо по стандарту, и наоборот - ошибкой является написание программы в предположении что 2×2 всегда в точности равно 2×2.

Собственно, что 2.0*2.0 может отличаться от 4.0 в каких-то далёких знаках после запятой, и сравнивать их в лоб нельзя, мы уже проходили - но это всегда воспринималось как пренебрежимо малые погрешности вычислений, которые в большинстве практических ситуаций - кроме собственно сравнения - можно игнорировать. Но если результат округляется до целого, а исходное значение окажется близко к порогу округления, то эта погрешность может вылезти уже не "в далёком знаке", а как лишняя или пропавшая вполне осязаемая единичка. Как я это отлавливал на реальной программе управления станочком - тема отдельная... :-)
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 11 comments