Рациональный тип данных
Некоторые языки программирования предоставляют встроенный (примитивный) рациональный тип данных для представления рациональных чисел , таких как 1/3 и -11/17, без округления и выполнения арифметических операций с ними. Примерами являются ratio
тип Common Lisp и аналогичные типы, предоставляемые большинством языков для алгебраических вычислений , таких как Mathematica и Maple . Многие языки, не имеющие встроенного рационального типа, по-прежнему предоставляют его как тип, определяемый библиотекой .
Представительство
[ редактировать ]Переменная или значение этого типа обычно представляется в виде дроби m / n, где m и n — два целых числа с фиксированной или произвольной точностью . В зависимости от языка знаменатель n может быть ненулевым , а два числа могут сохраняться в сокращенной форме (без каких-либо общих делителей, кроме 1).
Языки, поддерживающие рациональный тип данных, обычно предоставляют специальный синтаксис для построения таких значений, а также расширяют базовые арифметические операции («+», «-», «×», «/», целочисленные степени ) и сравнения («=», '<', '>', '≤') для воздействия на них — либо изначально, либо с помощью средств перегрузки операторов, предоставляемых языком. Эти операции могут быть преобразованы компилятором в последовательность целочисленных машинных инструкций или в вызовы библиотеки . Поддержка может также распространяться на другие операции, такие как форматирование, округление до целого числа или значения с плавающей запятой и т. д. Как и в математике, эти языки часто интерпретируют целочисленное значение как эквивалент рационального значения с единичным знаменателем.
Языковая поддержка
[ редактировать ]Встроенная или основная библиотека :
- В C++ включена поддержка рациональной арифметики во время компиляции в форме содержимого файлов стандартной библиотеки .
<ratio>
заголовок с момента его редакции 2011 года . - Clojure может выполнять арифметические операции с рациональными числами и предлагает буквальную форму для их представления.
- Go предоставляет рациональные числа в стандартной библиотеке, в
math/big
упаковка . - J предоставляет рациональные числа на базовом языке. Например,
1r3
составляет одну треть. Рациональные числа в J используют целые числа произвольной точности как в числителе, так и в знаменателе, что позволяет использовать нецелые числа произвольной точности. Например,12683021339465478347804472r7322545784478161858100577
представляет собой квадратный корень из трех-пяти десятичных цифр. [1] - Джулия предоставляет рациональные числа с помощью рационального оператора:
//
. Например,6//9 == 2//3 && typeof(-4//9) == Rational{Int64}
. [2] - Хаскель предоставляет
Rational
type, который на самом деле является псевдонимом дляRatio Integer
(Ratio
будучи полиморфным типом, реализующим рациональные числа для любогоIntegral
тип числителей и знаменателей). Дробь строится с помощью оператора %. [3] - Библиотека Num OCaml реализует рациональные числа произвольной точности.
- Перл :
Math::BigRat
Основной модуль реализует рациональные числа произвольной точности.bigrat
pragma можно использовать для включения прозрачной поддержки BigRat. - Раку : использовать по умолчанию.
Rat
[4] тип (рациональные числа с ограниченной точностью).FatRat
[5] Тип данных реализует рациональные числа произвольной точности. - Python : стандартная библиотека включает в себя
Fraction
класс в модулеfractions
. [6] - Ruby : встроенная поддержка с использованием специального синтаксиса.
- Smalltalk представляет рациональные числа с помощью
Fraction
класс в формеp/q
гдеp
иq
являются целыми числами произвольного размера. Применение арифметических операций*
,+
,-
,/
, to дроби возвращает уменьшенную дробь .
С внешними библиотеками :
- Для C и C++ существуют такие проекты, как GNU Multiple Precision Arithmetic Library .
- Библиотека Apache Commons Math предоставляет рациональные числа для Java с помощью своей
Fraction
сорт.
Общий Лисп
[ редактировать ]Common Lisp предоставляет числовой тип данных для рациональных чисел произвольного размера: СООТНОШЕНИЕ . [7]
1/3
⇒ 1/3
Тип рационального числа – это RATIO
:
(type-of 1/3)
⇒ RATIO
Деление двух целых чисел может вернуть рациональное число, а умножение рационального числа может вернуть целое число:
(/ 6 8)
⇒ 3/4
(* 3/4 16)
⇒ 12
Числитель можно получить с помощью одноименных функций, которые приводят рациональную форму к канонической и знаменатель и вычисляют числитель или знаменатель этой формы соответственно: [8]
(numerator 12/16)
⇒ 3
(denominator 12/16)
⇒ 4
Вычисления с большими целыми числами, возвращающие большое рациональное число:
(/ (1- (expt 2 200)) (1- (expt 2 43)))
⇒ 1606938044258990275541962092341162602522202993782792835301375/8796093022207
Кложур
[ редактировать ](print (+ 1/10 2/10)) ⇒ 3/10
Юлия
[ редактировать ]julia> 1//10 + 2//10
3//10
Хаскелл
[ редактировать ]В модуле Data.Ratio
(1 % 10) + (2 % 10) ⇒ 3 % 10
Ракетка (схема PLT)
[ редактировать ]> (+ 1/10 2/10)
3/10
Раку
[ редактировать ]Раку предоставляет Rat
тип по умолчанию.
my $v = 0.2;
say "{$v} is {$v.^name} and has numerator {$v.numerator} and denominator {$v.denominator}";
# ⇒ 0.2 is Rat and has numerator 1 and denominator 5
say 0.1 + 0.2
# ⇒ 0.3
say (0.1 + 0.2 - 0.3).fmt("%.17f")
# ⇒ 0.00000000000000000
say 1 / (0.1 + 0.2 - 0.3)
# ⇒ Attempt to divide by zero when coercing Rational to Str
Руби
[ редактировать ]Использование специального синтаксиса в версии 2.1 или новее:
irb(main):001:0> puts 1/10r + 2/10r
3/10
=> nil
Ссылки
[ редактировать ]- ^ «Словарь/NumericPrecisions — J Wiki» .
- ^ «Комплексные и рациональные числа — документация по разработке языка Julia Language» . docs.julialang.org . Архивировано из оригинала 15 июля 2012 г.
- ^ «Отчет библиотеки Haskell 98: рациональные числа» .
- ^ «Класс Крыса» .
- ^ «Класс FatRat» .
- ^ «Дроби — Рациональные числа — Документация Python 3.10.0» .
- ^ Common Lisp HyperSpec: ОТНОШЕНИЕ
- ^ Функция ЧИСЛИТЕЛЬ, ЗНАЧИТЕЛЬ в Common Lisp HyperSpec
- Дональд Кнут , Искусство компьютерного программирования , т. 2. Аддисон-Уэсли.