Jump to content

Числовая башня

В 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.

  1. ^ «Пересмотренный 7 Отчет о схеме алгоритмического языка: 6.2.4: Расширения реализации» (PDF) .
  2. ^ «Пересмотренный 5 Отчет о схеме алгоритмического языка: 6.2.1: Числовые типы» (PDF) .
  3. ^ «Пересмотренный 7 Отчет о схеме алгоритмического языка: 6.2.1: Числовые типы» (PDF) .
  4. ^ «Справочник Kawa‌ Документация: 12.4. Кватернионы» .
  5. ^ «Справочная документация Kawa: 12.5 Количества и единицы измерения» .
  6. ^ «Пересмотренный 7 Отчет о схеме алгоритмического языка: 6.2.2: Точность» (PDF) .
  7. ^ «PEP 3141 — Иерархия типов чисел» .
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: a6744adab95fcc937450be69e826ee9c__1683273420
URL1:https://arc.ask3.ru/arc/aa/a6/9c/a6744adab95fcc937450be69e826ee9c.html
Заголовок, (Title) документа по адресу, URL1:
Numerical tower - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)