Как функция Scheme работает неточно -> точно?

Как устроена схема процедуры inexact->exact, описанные в SICP, работают?

2 ответа

Стандарт Scheme дает только некоторые общие ограничения на то, как записывается точность / неточность, но большинство реализаций Scheme, вплоть до стандарта R5RS, работают следующим образом (схема MIT, которая является "родным языком" SICP, также работает следующим образом):

  1. Информация о типе для каждой ячейки, которая содержит данные числового типа, указывает, являются ли данные точными или неточными.
  2. Арифметические операции над записью данных выводят точность результата из точности входных данных, где обычно неточность является заразной: если какой-либо из операндов неточен, результат, вероятно, будет также. Однако обратите внимание, что реализациям Scheme разрешено выводить точность в особых случаях, например, если вы умножите неточный 4,3 на точное 0, вы можете точно знать, что результат равен 0.
  3. Специальные операции "Неточный - точный и точный -> неточный" являются приведениями к числовым типам, гарантируя, что результирующий тип будет точным или неточным соответственно.

Некоторые моменты: во-первых, разные стандарты схемы различаются, когда операторы дают точность или нет; стандарты определяют, что происходит. Например, несколько реализаций Scheme имеют представления для точных рациональных значений, что позволяет (/ 1 3) быть представленным именно там, где реализация Scheme только с плавающей точкой должна представлять это неточно.

Во-вторых, R6RS имеет понятие заражения, отличное от SICP и более ранних стандартов, потому что, честно говоря, более старый критерий нарушен.

Точность - это просто свойство числа: оно не меняет значение самого числа. Таким образом, для реализации, которая использует флаг, чтобы указать точность, inexact->exact просто устанавливает флаг точности на это число.

Другие вопросы по тегам