Введение

Набор типов данных, представляющих числа в заданном языке программирования. В Scheme и диалектах Lisp, вдохновленных им, числовая башня — это набор типов данных, представляющих числа, и логика их иерархической организации. Каждый тип в этой башне концептуально "основан" на более фундаментальном типе, поэтому целое число является рациональным числом и числом, но обратное не всегда верно, то есть не каждое число является целым. Эта асимметрия означает, что язык может безопасно разрешать неявные приведения численных типов, не создавая семантических проблем, только в одном направлении: приведение целого числа к рациональному не приводит к потере информации и никогда не повлияет на значение, возвращаемое функцией, в то время как приведение большинства вещественных чисел к целому изменит любое релевантное вычисление (например, вещественное число 1/3 не равно никакому целому числу) и, следовательно, недопустимо.

В Lisp

В основном, числовая башня предназначена для кодификации теоретико-множественных свойств чисел в удобном для реализации языковом механизме: каждое целое число является рациональным с неявным знаменателем 1, а все действительные числа – комплексными с неявной мнимой частью 0. На практике реализация может экономить время и память, игнорируя эти свойства, пока они не станут арифметически релевантными, а также может повысить эффективность представления, приводя числовые значения к их канонической форме путем исключения пренебрежимо малых компонентов. Наиболее общий тип, "number" (число), несколько сбивает с толку: он предназначен для охвата всех математических значений, чей тип более общий, чем комплексный, но которые все еще могут использоваться со стандартными математическими операциями, определенными в Scheme. Таким образом, он охватывает, например, положительную и отрицательную бесконечность (+inf.0 и -inf.0, где "значение" означает приближение до кардинальности), поскольку это математические объекты, к которым могут быть применены хотя бы некоторые числовые операции (например, к бесконечности можно прибавлять или умножать, получая бесконечность; или сравнивать кардинальность с бесконечностью, при этом бесконечность всегда больше любого конечного значения). На более техническом уровне, тип "number" в Lisp просто предоставляет место в иерархии типов для нестрого числовых значений, определенных стандартом IEEE 754. Язык программирования Scheme определяет всю свою арифметику в рамках этой модели, как и большинство других диалектов Lisp. Некоторые реализации могут расширять или адаптировать эту башню. Kawa, реализация Scheme для JVM, расширяет башню, включая кватернионы и величины, причем величины позволяют создавать подтипы численных значений с единицами измерения; например, число граммов нельзя осмысленно складывать с числом метров, поскольку через величины числа наследуют логику, вытекающую из размерного анализа, которая определяет их значение и, следовательно, допустимые арифметические взаимодействия между ними. Другая распространенная вариация – поддержка точных и неточных версий башни или ее частей; R7RS Scheme рекомендует, но не требует этого от реализаций. В этом случае используется схожая семантика для определения допустимости неявного приведения типов: неточность – это "заразное" свойство чисел, и любая числовая операция, включающая как точные, так и неточные значения, должна возвращать неточное значение, по крайней мере, такой же точности, как самое точное неточное число в выражении, если только точность не является практически бесконечной (например, содержит обнаруживаемую периодичность), или если можно доказать, что точность результата операции не зависит от неточности каких-либо из ее операндов (например, в серии умножений, где хотя бы один множитель равен 0).