Как функция Scheme работает неточно -> точно?
Как устроена схема процедуры inexact->exact
, описанные в SICP, работают?
2 ответа
Стандарт Scheme дает только некоторые общие ограничения на то, как записывается точность / неточность, но большинство реализаций Scheme, вплоть до стандарта R5RS, работают следующим образом (схема MIT, которая является "родным языком" SICP, также работает следующим образом):
- Информация о типе для каждой ячейки, которая содержит данные числового типа, указывает, являются ли данные точными или неточными.
- Арифметические операции над записью данных выводят точность результата из точности входных данных, где обычно неточность является заразной: если какой-либо из операндов неточен, результат, вероятно, будет также. Однако обратите внимание, что реализациям Scheme разрешено выводить точность в особых случаях, например, если вы умножите неточный 4,3 на точное 0, вы можете точно знать, что результат равен 0.
- Специальные операции "Неточный - точный и точный -> неточный" являются приведениями к числовым типам, гарантируя, что результирующий тип будет точным или неточным соответственно.
Некоторые моменты: во-первых, разные стандарты схемы различаются, когда операторы дают точность или нет; стандарты определяют, что происходит. Например, несколько реализаций Scheme имеют представления для точных рациональных значений, что позволяет (/ 1 3)
быть представленным именно там, где реализация Scheme только с плавающей точкой должна представлять это неточно.
Во-вторых, R6RS имеет понятие заражения, отличное от SICP и более ранних стандартов, потому что, честно говоря, более старый критерий нарушен.
Точность - это просто свойство числа: оно не меняет значение самого числа. Таким образом, для реализации, которая использует флаг, чтобы указать точность, inexact->exact
просто устанавливает флаг точности на это число.