Jump to content

Рациональный тип данных

Некоторые языки программирования предоставляют встроенный (примитивный) рациональный тип данных для представления рациональных чисел , таких как 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 дроби возвращает уменьшенную дробь .

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

Общий Лисп

[ редактировать ]

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
  1. ^ «Словарь/NumericPrecisions — J Wiki» .
  2. ^ «Комплексные и рациональные числа — документация по разработке языка Julia Language» . docs.julialang.org . Архивировано из оригинала 15 июля 2012 г.
  3. ^ «Отчет библиотеки Haskell 98: рациональные числа» .
  4. ^ «Класс Крыса» .
  5. ^ «Класс FatRat» .
  6. ^ «Дроби — Рациональные числа — Документация Python 3.10.0» .
  7. ^ Common Lisp HyperSpec: ОТНОШЕНИЕ
  8. ^ Функция ЧИСЛИТЕЛЬ, ЗНАЧИТЕЛЬ в Common Lisp HyperSpec
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: c2141a1c2fe2c21b968b0fdd027bcab8__1704571080
URL1:https://arc.ask3.ru/arc/aa/c2/b8/c2141a1c2fe2c21b968b0fdd027bcab8.html
Заголовок, (Title) документа по адресу, URL1:
Rational data type - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)