Числовая башня
В Scheme и Lisp вдохновленных ею диалектах числовая башня представляет собой набор типов данных , которые представляют числа и логику их иерархической организации.
Каждый тип в башне концептуально «основан» на более фундаментальном типе, поэтому целое число — это рациональное число и число , но обратное не обязательно верно, т. е. не каждое число является целым. Эта асимметрия означает, что язык может безопасно допускать неявное приведение числовых типов — не создавая семантических проблем — только в одном направлении: приведение целого числа к рациональному не теряет никакой информации и никогда не повлияет на значение, возвращаемое функцией, но приведёт к приведению большинства вещественных чисел. в целое число изменило бы любые соответствующие вычисления (например, действительная 1/3 не равна никакому целому числу) и, таким образом, недопустимо.
В Лиспе
[ редактировать ]По сути, числовая башня предназначена для кодификации теоретико-множественных свойств чисел с помощью простого в реализации языкового средства: каждое целое число является рациональным с неявным знаменателем 1, а все действительные числа являются комплексными с неявной мнимой частью 0. На практике реализация может сэкономить время и пространство, игнорируя эти свойства, если только они не станут арифметически релевантными, а также может соответственно повысить эффективность их представления при приведении числовых значений к их каноническому представлению за счет исключения незначительных компонентов числа.
Самый общий тип, number
, имеет несколько запутанное название: он существует для сбора всех математических значений, тип которых является более общим, чем complex , но которые все еще можно использовать со стандартными математическими операциями, как определено Scheme. Таким образом, он фиксирует, например, положительную и отрицательную бесконечность ( +inf.0
и -inf.0
, мантисса здесь означает приближение до мощности), поскольку это математические объекты, к которым могут быть действительно применимы по крайней мере некоторые числовые операции (например, можно прибавлять или умножать на бесконечность, получая бесконечность; или сравнивать мощность с бесконечностью, причем бесконечность всегда равна бесконечности). больше любого конечного значения). [1] На более техническом уровне, number
в Lisp просто предоставляет место в иерархии типов для типов нестрого числовых значений, определенных IEEE 754 .
Язык программирования Scheme определяет всю свою арифметику в рамках этой модели, как и большинство других диалектов Lisp. [2] [3] Некоторые реализации могут расширять или адаптировать башню. Kawa , реализация Scheme для JVM , расширяет башню, включив в нее оба кватерниона. [4] и количества, [5] при этом количества являются способом подтипирования числовых значений с помощью единиц измерения; например, количество граммов не может быть осмысленно добавлено к количеству метров , потому что через количества числа наследуют логику, полученную в результате анализа размерностей , чтобы управлять их значением по отношению к и, таким образом, действительными арифметическими взаимодействиями друг с другом.
Другой распространенный вариант — поддержка как точных, так и неточных версий башни или ее частей; Р 7 RS Scheme рекомендует, но не требует этого от реализаций. В данном случае аналогичная семантика используется для определения допустимости неявного приведения: неточность — заразительное свойство чисел, [6] и любая числовая операция, включающая как точные, так и неточные значения, должна давать неточные возвращаемые значения по крайней мере той же точности , что и самое точное неточное число, появляющееся в выражении, за исключением случаев, когда точность практически бесконечна (например, содержит обнаруживаемое повторение ) или если она не может доказать, что точность результата операции не зависит от неточности любого из ее операндов (например, серии умножений, в которой хотя бы одно множимое равно 0).
На других языках
[ редактировать ]Большинство языков программирования и языковых реализаций не поддерживают числовую башню, подобную Scheme, хотя некоторые языки предоставляют ограниченную или непоследовательную поддержку, если позволяет простота реализации. Python , например, предоставляет аналогичную структуру через PEP3141: [7] цитируя пример Схемы, хотя на практике рациональные числа ( fractions
) должны быть импортированы из собственного модуля, и как рациональные, так и комплексные числа используют немного отличающийся от обычных числовых литералов синтаксис, поскольку синтаксис Python менее явный, чем синтаксис Lisp.
Таким образом, в следующих примерах схем мы видим:
1 -2 +3
⇒ 1
⇒ -2
⇒ 3
1/3
⇒ 1/3
72/6+8/3i
⇒ 12+8/3i ; coercion: canonical form
(+ 3+2i 2-2i)
⇒ 5 ; coercion: canonical form
(- 3-62/32i 1+inf.0i)
⇒ 2-inf.0i ; coercion: infinite cardinality
(> 3+0/2i 3)
⇒ #f ; coercion: 3 ≯ 3
В следующих примерах Python мы видим:
1; -2; +3
⇒ 1
⇒ -2
⇒ 3
1/3
⇒ 0.3333333333333333
inf = float('inf') # infinity not first-class
from fractions import Fraction
x = Fraction(1, 3)
y = Fraction(2, 3)
x + y
⇒ Fraction(1, 1) # no coercion
(3+2j)
⇒ (3+2j)
complex(x, inf)
⇒ (0.3333333333333333+infj) # coercion: equality violated
a = 1/3
b = Fraction(1, 3)
caz = complex(a, 0)
cbz = complex(b, 0)
a == b
⇒ False
caz == cbz
⇒ True # proof of equality violation
complex(x + y, -inf)
⇒ (1-infj) # coercion: equality preserved
(3+0j) > 3
⇒ Traceback (most recent call last):
⇒ File "<stdin>", line 1, in <module> # no coercion: type error
⇒ TypeError: '>' not supported between instances of 'complex' and 'int'
В примерах Python мы видим, что числовые проблемы возникают при непоследовательном применении семантики приведения типов. Пока 1 / 3
в Python рассматривается как вызов деления 1 на 3, что дает число с плавающей запятой, включение рациональных чисел в комплексное число, хотя и явно допустимо, неявно приводит их из рациональных чисел к числам с плавающей запятой или целым числам, даже в тех случаях, когда это неверно.
Smalltalk — еще один язык программирования, который следует этой модели, но у него есть ArithmeticValue и Magnitude как суперклассы Number.
Ссылки
[ редактировать ]- ^ «Пересмотренный 7 Отчет о схеме алгоритмического языка: 6.2.4: Расширения реализации» (PDF) .
- ^ «Пересмотренный 5 Отчет о схеме алгоритмического языка: 6.2.1: Числовые типы» (PDF) .
- ^ «Пересмотренный 7 Отчет о схеме алгоритмического языка: 6.2.1: Числовые типы» (PDF) .
- ^ «Справочник Kawa Документация: 12.4. Кватернионы» .
- ^ «Справочная документация Kawa: 12.5 Количества и единицы измерения» .
- ^ «Пересмотренный 7 Отчет о схеме алгоритмического языка: 6.2.2: Точность» (PDF) .
- ^ «PEP 3141 — Иерархия типов чисел» .