Результат: ученик предсказывает машинный результат целочисленных и дробных вычислений, обнаруживает переполнение и потерю точности и выбирает корректную модель сравнения числовых результатов.

Содержание:

  1. Проследить продвижение целочисленных операндов

    • вычисление большинства операций над малыми целыми в типе int;
    • влияние uint, long и ulong на общий тип выражения;
    • различие типа переменной и типа промежуточного результата;
    • необходимость преобразования при присваивании обратно в узкий тип.
  2. Понять целочисленное деление и остаток

    • отбрасывание дробной части при делении целых;
    • знак частного и остатка;
    • тождество a == (a / b) * b + a % b при ненулевом b;
    • порядок преобразования к дробному типу;
    • ошибки формулы из-за слишком позднего преобразования.
  3. Работать с диапазоном и переполнением

    • конечный диапазон каждого целочисленного типа;
    • переполнение промежуточного результата;
    • контексты checked и unchecked;
    • различие переполнения константного выражения и вычисления времени выполнения;
    • выбор более широкого типа до выполнения операции;
    • отсутствие гарантии, что математически правильная формула представима выбранным типом.
  4. Понять двоичную модель float и double

    • конечная точность и округление после операций;
    • непредставимость большинства десятичных дробей;
    • накопление ошибки;
    • порядок операций и потеря значащих разрядов;
    • различие математической и машинной ассоциативности.
  5. Распознавать специальные дробные значения

    • NaN; положительная и отрицательная бесконечность;
    • получение специальных значений при некоторых операциях;
    • необычное поведение сравнений с NaN;
    • проверки IsNaN, IsInfinity и конечности;
    • недопустимость специальных значений в предметной модели без явного решения.
  6. Понять десятичную модель decimal

    • точное представление многих конечных десятичных дробей;
    • ограниченный диапазон и конечная точность;
    • отличие от двоичных дробных типов;
    • переполнение как отдельный риск;
    • выбор модели по предметной семантике, а не по внешнему виду числа.
  7. Сравнивать приближённые значения

    • почему точное == часто непригодно для вычисленных float и double;
    • абсолютный допуск;
    • относительный допуск;
    • совместный критерий для малых и больших масштабов;
    • содержательный выбор допуска;
    • отделение ошибки представления от ошибки алгоритма.
  8. Оценивать численную устойчивость

    • эквивалентные математические формулы с разными машинными результатами;
    • вычитание близких величин;
    • переполнение до последующего деления;
    • потеря данных при раннем округлении;
    • независимая проверка результата тождеством, обратной операцией или балансом.