sicp.io
2.5.1 · Обобщенные арифметические операции

Числовая башня с повышением и понижением типа

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

Вопрос для размышления

Как смешанная арифметика может находить общий тип и затем возвращаться к более простому типу без потери информации?

  • Назначение явного ранга каждому типу в числовой башне
  • Повышение типа меньших значений до тех пор, пока оба операнда не получат общий метод
  • Отделение арифметики одинаковых типов от правил приведения типов
  • Проецирование результата только тогда, когда повторное повышение типа воспроизводит исходное значение
  • Сохранение комплексного значения, когда ненулевая мнимая часть была бы потеряна

add сначала повышает ранг младшего операнда до тех пор, пока оба значения не получат одинаковый тег. Затем same-type-add выполняет арифметику только для конкретного представления. Целые числа integer повышаются до рациональных чисел со знаменателем 1, а рациональные числа повышаются до комплексных чисел с нулевой мнимой частью. Арифметические методы не определяют, какие преобразования разрешены.

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

Код SICP3,793 из 1,048,576 байт UTF-8
Примеры
Результат
Вывод
Значение
Диагностика
Трасса выполнения0 / 0 событий
    Запуски происходят внутри браузера с отображением результата программы и трассы выполнения.
    Ожидаемый результат

    Программа возвращает ((rational 7 2) (integer 1) (integer 5) (complex (rational 3 1) (rational 1 1))).

    На что обратить внимание в трассе

    Для каждого вызова add зафиксируйте оба начальных ранга и каждое повышение raise. Затем перейдите к ровно одному методу для одинаковых типов. Проследите за project, raise и generic-equal? в процессе понижения drop: комплексный результат с нулевой мнимой частью доходит до integer 5, тогда как итоговый результат с ненулевой мнимой частью остается complex.

    Попробуйте сами

    Измените программу и сравните результат.

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

    Показать подсказку

    Оставьте преобразование вне метода для одинаковых типов. Для произведения комплексных чисел требуются сложение, вычитание и умножение рациональных чисел над двумя его компонентами.

    Завершить этот урок

    В этой главе пройдено 0 из 20 уроков0%