Рациональный тип данных - Википедия - Rational data type

Немного языки программирования предоставить встроенный (примитивный) рациональный тип данных представлять рациональное число например, 1/3 и -11/17 без округления, и делать с ними арифметические операции. Примерами являются соотношение тип Common Lisp, и аналогичные типы, предоставляемые большинством языков для алгебраические вычисления, Такие как Mathematica и Клен. Многие языки, в которых нет встроенного рационального типа, по-прежнему предоставляют его как библиотека -определенный тип.

Представление

Переменная или значение этого типа обычно представляется как дробная часть м/п куда м и п два целое число числа, либо с фиксированным, либо произвольная точность. В зависимости от языка знаменатель п может быть ограничен, чтобы быть ненулевым, и два числа могут быть сохранены в сокращенной форме (без каких-либо общих делители кроме 1).

Языки, поддерживающие рациональный тип данных, обычно предоставляют специальный синтаксис для построения таких значений, а также расширяют базовые арифметические операции ('+', '-', '×', '/', целое число полномочия ) и сравнения ('=', '<', '>', '≤'), чтобы воздействовать на них - либо изначально, либо через перегрузка оператора возможности, предоставляемые языком. Эти операции могут быть переведены компилятор в последовательность целых чисел машинные инструкции, или в библиотека звонки. Поддержка также может распространяться на другие операции, такие как форматирование, округление до целого числа или плавающая точка значение и т. д. Как и в математике, эти языки часто интерпретируют целочисленное значение как эквивалент рационального значения с единичным знаменателем.

Языковая поддержка

Встроенная или базовая библиотека:

  • C ++ включает поддержку рациональной арифметики времени компиляции в виде содержимого его стандартная библиотека с <ratio> заголовок поскольку его редакция 2011 г..
  • Clojure может выполнять арифметические действия с рациональными числами и предлагает буквальную форму для их представления.
  • Идти предоставляет рациональные числа в стандартной библиотеке, в математика / большой упаковка.
  • J предоставляет рациональные числа на основном языке. Например, 1r3 составляет одну треть. Рациональное использование J произвольная точность целые числа для числителя и знаменателя, что позволяет использовать нецелые числа произвольной точности. Например, 12683021339465478347804472r7322545784478161858100577 представляет собой квадратный корень из трех до 50 десятичных цифр.[1]
  • Юля предоставляет рациональные числа с помощью рационального оператора, //. Например, 6//9 == 2//3 && тип(-4//9) == Рациональный{Int64}.[2]
  • Haskell обеспечивает Рациональный type, который на самом деле является псевдонимом для Отношение Целое число (Соотношение являясь полиморфным типом, реализующим рациональные числа для любых интеграл тип числителей и знаменателей). Дробь строится с помощью оператора%.[3]
  • OCaml Библиотека Num реализует рациональные числа произвольной точности.
  • Perl: Math :: BigRat Основной модуль реализует рациональные числа произвольной точности. В большая крыса pragma можно использовать для включения прозрачной поддержки BigRat.
  • Раку: использовать по умолчанию Крыса[4] тип (рациональные числа с ограниченной точностью). FatRat[5] Тип данных реализует рациональные числа произвольной точности.
  • Python 2.6+: Python стандартная библиотека включает Дробная часть класс в модуле фракции.[6]
  • Рубин 2.1 или новее: встроенная поддержка с использованием специального синтаксиса.
  • Ruby pre 2.1: через стандартную библиотеку включает Рациональный класс в модуле рациональный.
  • Болтовня представляет рациональные числа с помощью Дробная часть класс в форме п / д куда п и q - целые числа произвольного размера. Применение арифметических операций *, +, -, /, в дроби возвращает уменьшенную дробь.

С внешними библиотеками:

Common Lisp

Common Lisp предоставляет числовой тип данных для рациональных чисел произвольного размера: СООТНОШЕНИЕ.[7]

 1/3  1/3

Тип рационального числа СООТНОШЕНИЕ:

 (тип 1/3)  СООТНОШЕНИЕ

Разделение двух целых чисел может вернуть рациональное число, а умножение рационального числа может вернуть целое число:

 (/ 6 8)  3/4 (* 3/4 16)  12

В числитель и знаменатель могут быть получены с использованием одноименных функций, которые приводят рациональную форму к канонической и вычисляют числитель или знаменатель этой формы соответственно:[8]

 (числитель 12/16)  3 (знаменатель 12/16)  4

Вычисления с большими целыми числами, возвращающие большое рациональное число:

 (/ (1- (expt 2 200)) (1- (expt 2 43)))  1606938044258990275541962092341162602522202993782792835301375/8796093022207

Clojure

(печать (+ 1/10 2/10)) ⇒ 3/10.

Юля

Юлия> 1//10 + 2//103//10

Haskell

В модуле Data.Ratio

(1 % 10) + (2 % 10) ⇒ 3 % 10

Ракетка (схема PLT)

> (+ 1/10 2/10)3/10

Раку

Раку обеспечивает Крыса тип по умолчанию.

мой $ v = 0.2;сказать "{$ v} равно {$ v. ^ name} и имеет числитель {$ v.numerator} и знаменатель {$ v.denominator}";# ⇒ 0,2 - это Крыса с числителем 1 и знаменателем 5
сказать 0.1 + 0.2# ⇒ 0.3
сказать (0.1 + 0.2 - 0.3).fmt("% .17f")# ⇒ 0.00000000000000000
сказать 1 / (0.1 + 0.2 - 0.3)# ⇒ Попытка разделить на ноль при приведении Rational к Str

Рубин

Использование специального синтаксиса в версии 2.1 или новее:

irb (основной): 001: 0>ставит 1/10р + 2/10р3/10=> ноль

Рекомендации