sicp.io
2.4.1 · Множественные представления комплексных чисел

Комплексное число в двух системах координат

Прямоугольное содержимое упрощает сложение, полярное упрощает умножение, а селекторы с метками дают клиентскому коду одно абстрактное число.

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

Как единый интерфейс комплексных чисел может одновременно сохранять преимущества прямоугольного и полярного представлений?

  • Создание прямоугольного содержимого из вещественной и мнимой частей
  • Создание полярного содержимого из модуля и угла
  • Диспетчеризация общих селекторов через метку представления
  • Использование прямоугольных координат для сложения и полярных координат для умножения
  • Сравнение неточных тригонометрических результатов с явным допуском

Прямоугольный объект хранит x и y, поэтому селекторы real-part и imag-part работают напрямую, тогда как модуль и угол вычисляются. Полярный объект хранит r и a, поэтому модуль и угол читаются напрямую, тогда как real-part и imag-part вычисляются. Внешняя метка относится к деталям представления и не является частью абстрактного комплексного значения, видимого клиентскому коду.

Первая программа создает 3 + 4i в обеих формах и опрашивает их через те же четыре селектора. Предикат close? фиксирует, что неточный тригонометрический путь совпадает в пределах объявленного допуска. Вторая программа складывает значения через вещественную и мнимую части и явно возвращает прямоугольный объект, а умножение объединяет модули и углы и возвращает полярный объект. Обобщенные селекторы проверяют абстрактные результаты, не раскрывая вызывающему коду внутреннее содержимое объектов.

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

    Первая программа возвращает (rectangular polar #t #t #t #t). Вторая программа возвращает (rectangular polar #t #t #t #t #t #t).

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

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

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

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

    Представьте -3 + 4i в обеих формах, используя модуль 5 и угол (atan 4.0 -3.0). Повторно используйте close? для проверки всех четырех селекторов, затем объясните, почему вызов atan с двумя аргументами важен за пределами первого квадранта.

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

    Знаки обеих координат определяют квадрант. Вызов atan с одним аргументом от деления y на x теряет это различие.

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

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